@hasna/conversations 0.1.19 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/index.js +273 -212
- package/bin/mcp.js +273 -212
- package/package.json +1 -1
package/bin/mcp.js
CHANGED
|
@@ -29777,7 +29777,7 @@ function renameAgent(oldName, newName) {
|
|
|
29777
29777
|
// package.json
|
|
29778
29778
|
var package_default = {
|
|
29779
29779
|
name: "@hasna/conversations",
|
|
29780
|
-
version: "0.1.
|
|
29780
|
+
version: "0.1.21",
|
|
29781
29781
|
description: "Real-time CLI messaging for AI agents",
|
|
29782
29782
|
type: "module",
|
|
29783
29783
|
bin: {
|
|
@@ -29860,43 +29860,22 @@ var server = new McpServer({
|
|
|
29860
29860
|
version: package_default.version
|
|
29861
29861
|
});
|
|
29862
29862
|
server.registerTool("send_message", {
|
|
29863
|
-
|
|
29864
|
-
description: "Send a direct message to another agent.",
|
|
29863
|
+
description: "Send a DM to an agent.",
|
|
29865
29864
|
inputSchema: {
|
|
29866
|
-
|
|
29867
|
-
|
|
29868
|
-
|
|
29869
|
-
|
|
29870
|
-
|
|
29871
|
-
|
|
29872
|
-
|
|
29873
|
-
|
|
29874
|
-
metadata: exports_external.string().optional().describe("JSON metadata string"),
|
|
29875
|
-
blocking: exports_external.boolean().optional().describe("Blocking message \u2014 recipients must acknowledge before continuing")
|
|
29876
|
-
}
|
|
29877
|
-
}, async ({ from: fromParam, to, content, session_id, priority, working_dir, repository, branch, metadata, blocking }) => {
|
|
29865
|
+
to: exports_external.string(),
|
|
29866
|
+
content: exports_external.string(),
|
|
29867
|
+
from: exports_external.string().optional(),
|
|
29868
|
+
priority: exports_external.string().optional(),
|
|
29869
|
+
blocking: exports_external.boolean().optional()
|
|
29870
|
+
}
|
|
29871
|
+
}, async (args) => {
|
|
29872
|
+
const { from: fromParam, to, content, priority, blocking } = args;
|
|
29878
29873
|
const from = resolveIdentity(fromParam);
|
|
29879
|
-
let parsedMetadata;
|
|
29880
|
-
if (metadata) {
|
|
29881
|
-
try {
|
|
29882
|
-
parsedMetadata = JSON.parse(metadata);
|
|
29883
|
-
} catch {
|
|
29884
|
-
return {
|
|
29885
|
-
content: [{ type: "text", text: "invalid JSON" }],
|
|
29886
|
-
isError: true
|
|
29887
|
-
};
|
|
29888
|
-
}
|
|
29889
|
-
}
|
|
29890
29874
|
const msg = sendMessage({
|
|
29891
29875
|
from,
|
|
29892
29876
|
to,
|
|
29893
29877
|
content,
|
|
29894
|
-
session_id,
|
|
29895
29878
|
priority,
|
|
29896
|
-
working_dir,
|
|
29897
|
-
repository,
|
|
29898
|
-
branch,
|
|
29899
|
-
metadata: parsedMetadata,
|
|
29900
29879
|
blocking
|
|
29901
29880
|
});
|
|
29902
29881
|
return {
|
|
@@ -29904,45 +29883,43 @@ server.registerTool("send_message", {
|
|
|
29904
29883
|
};
|
|
29905
29884
|
});
|
|
29906
29885
|
server.registerTool("read_messages", {
|
|
29907
|
-
|
|
29908
|
-
description: "Read messages with optional filters. Returns messages sorted by time.",
|
|
29886
|
+
description: "Read DMs with optional filters.",
|
|
29909
29887
|
inputSchema: {
|
|
29910
|
-
session_id: exports_external.string().optional()
|
|
29911
|
-
from: exports_external.string().optional()
|
|
29912
|
-
to: exports_external.string().optional()
|
|
29913
|
-
space: exports_external.string().optional()
|
|
29914
|
-
since: exports_external.string().optional()
|
|
29915
|
-
limit: exports_external.number().optional()
|
|
29916
|
-
unread_only: exports_external.boolean().optional()
|
|
29917
|
-
}
|
|
29918
|
-
}, async (
|
|
29919
|
-
const messages = readMessages(
|
|
29888
|
+
session_id: exports_external.string().optional(),
|
|
29889
|
+
from: exports_external.string().optional(),
|
|
29890
|
+
to: exports_external.string().optional(),
|
|
29891
|
+
space: exports_external.string().optional(),
|
|
29892
|
+
since: exports_external.string().optional(),
|
|
29893
|
+
limit: exports_external.number().optional(),
|
|
29894
|
+
unread_only: exports_external.boolean().optional()
|
|
29895
|
+
}
|
|
29896
|
+
}, async (args) => {
|
|
29897
|
+
const messages = readMessages(args);
|
|
29920
29898
|
return {
|
|
29921
29899
|
content: [{ type: "text", text: JSON.stringify(messages, null, 2) }]
|
|
29922
29900
|
};
|
|
29923
29901
|
});
|
|
29924
29902
|
server.registerTool("list_sessions", {
|
|
29925
|
-
|
|
29926
|
-
description: "List conversation sessions, optionally filtered to a specific agent.",
|
|
29903
|
+
description: "List all sessions by agent.",
|
|
29927
29904
|
inputSchema: {
|
|
29928
|
-
agent: exports_external.string().optional()
|
|
29905
|
+
agent: exports_external.string().optional()
|
|
29929
29906
|
}
|
|
29930
|
-
}, async (
|
|
29907
|
+
}, async (args) => {
|
|
29908
|
+
const { agent } = args;
|
|
29931
29909
|
const sessions = listSessions(agent);
|
|
29932
29910
|
return {
|
|
29933
29911
|
content: [{ type: "text", text: JSON.stringify(sessions, null, 2) }]
|
|
29934
29912
|
};
|
|
29935
29913
|
});
|
|
29936
29914
|
server.registerTool("reply", {
|
|
29937
|
-
|
|
29938
|
-
description: "Reply to a message by ID. Uses the same session and sends to the original sender.",
|
|
29915
|
+
description: "Reply to a message by ID.",
|
|
29939
29916
|
inputSchema: {
|
|
29940
|
-
|
|
29941
|
-
|
|
29942
|
-
|
|
29943
|
-
priority: exports_external.enum(["low", "normal", "high", "urgent"]).optional().describe("Message priority")
|
|
29917
|
+
message_id: exports_external.number(),
|
|
29918
|
+
content: exports_external.string(),
|
|
29919
|
+
from: exports_external.string().optional()
|
|
29944
29920
|
}
|
|
29945
|
-
}, async (
|
|
29921
|
+
}, async (args) => {
|
|
29922
|
+
const { from: fromParam, message_id, content } = args;
|
|
29946
29923
|
const original = getMessageById(message_id);
|
|
29947
29924
|
if (!original) {
|
|
29948
29925
|
return {
|
|
@@ -29958,7 +29935,6 @@ server.registerTool("reply", {
|
|
|
29958
29935
|
to,
|
|
29959
29936
|
content,
|
|
29960
29937
|
session_id: original.session_id,
|
|
29961
|
-
priority,
|
|
29962
29938
|
space
|
|
29963
29939
|
});
|
|
29964
29940
|
return {
|
|
@@ -29966,14 +29942,14 @@ server.registerTool("reply", {
|
|
|
29966
29942
|
};
|
|
29967
29943
|
});
|
|
29968
29944
|
server.registerTool("mark_read", {
|
|
29969
|
-
|
|
29970
|
-
description: "Mark messages as read. Provide IDs or set 'all' to true.",
|
|
29945
|
+
description: "Mark messages read by IDs or all.",
|
|
29971
29946
|
inputSchema: {
|
|
29972
|
-
from: exports_external.string().optional()
|
|
29973
|
-
ids: exports_external.array(exports_external.number()).optional()
|
|
29974
|
-
all: exports_external.boolean().optional()
|
|
29947
|
+
from: exports_external.string().optional(),
|
|
29948
|
+
ids: exports_external.array(exports_external.number()).optional(),
|
|
29949
|
+
all: exports_external.boolean().optional()
|
|
29975
29950
|
}
|
|
29976
|
-
}, async (
|
|
29951
|
+
}, async (args) => {
|
|
29952
|
+
const { from: fromParam, ids, all } = args;
|
|
29977
29953
|
const agent = resolveIdentity(fromParam);
|
|
29978
29954
|
let count;
|
|
29979
29955
|
if (all) {
|
|
@@ -29991,49 +29967,49 @@ server.registerTool("mark_read", {
|
|
|
29991
29967
|
};
|
|
29992
29968
|
});
|
|
29993
29969
|
server.registerTool("search_messages", {
|
|
29994
|
-
|
|
29995
|
-
description: "Full-text search across message content, newest first.",
|
|
29970
|
+
description: "Full-text search across messages.",
|
|
29996
29971
|
inputSchema: {
|
|
29997
|
-
query: exports_external.string()
|
|
29998
|
-
space: exports_external.string().optional()
|
|
29999
|
-
from: exports_external.string().optional()
|
|
30000
|
-
to: exports_external.string().optional()
|
|
30001
|
-
limit: exports_external.number().optional()
|
|
30002
|
-
}
|
|
30003
|
-
}, async (
|
|
29972
|
+
query: exports_external.string(),
|
|
29973
|
+
space: exports_external.string().optional(),
|
|
29974
|
+
from: exports_external.string().optional(),
|
|
29975
|
+
to: exports_external.string().optional(),
|
|
29976
|
+
limit: exports_external.number().optional()
|
|
29977
|
+
}
|
|
29978
|
+
}, async (args) => {
|
|
29979
|
+
const { query, space, from, to, limit } = args;
|
|
30004
29980
|
const messages = searchMessages({ query, space, from, to, limit });
|
|
30005
29981
|
return {
|
|
30006
29982
|
content: [{ type: "text", text: JSON.stringify(messages, null, 2) }]
|
|
30007
29983
|
};
|
|
30008
29984
|
});
|
|
30009
29985
|
server.registerTool("export_messages", {
|
|
30010
|
-
|
|
30011
|
-
description: "Export messages as JSON or CSV with optional filters.",
|
|
29986
|
+
description: "Export messages as JSON or CSV.",
|
|
30012
29987
|
inputSchema: {
|
|
30013
|
-
space: exports_external.string().optional()
|
|
30014
|
-
session_id: exports_external.string().optional()
|
|
30015
|
-
from: exports_external.string().optional()
|
|
30016
|
-
since: exports_external.string().optional()
|
|
30017
|
-
until: exports_external.string().optional()
|
|
30018
|
-
format: exports_external.
|
|
30019
|
-
}
|
|
30020
|
-
}, async (
|
|
29988
|
+
space: exports_external.string().optional(),
|
|
29989
|
+
session_id: exports_external.string().optional(),
|
|
29990
|
+
from: exports_external.string().optional(),
|
|
29991
|
+
since: exports_external.string().optional(),
|
|
29992
|
+
until: exports_external.string().optional(),
|
|
29993
|
+
format: exports_external.string().optional()
|
|
29994
|
+
}
|
|
29995
|
+
}, async (args) => {
|
|
29996
|
+
const { space, session_id, from, since, until, format } = args;
|
|
30021
29997
|
const result = exportMessages({ space, session_id, from, since, until, format });
|
|
30022
29998
|
return {
|
|
30023
29999
|
content: [{ type: "text", text: result }]
|
|
30024
30000
|
};
|
|
30025
30001
|
});
|
|
30026
30002
|
server.registerTool("create_space", {
|
|
30027
|
-
|
|
30028
|
-
description: "Create a new space. Creator is auto-joined. Supports nesting (max 3 levels) and project association.",
|
|
30003
|
+
description: "Create a space and auto-join.",
|
|
30029
30004
|
inputSchema: {
|
|
30030
|
-
|
|
30031
|
-
|
|
30032
|
-
description: exports_external.string().optional()
|
|
30033
|
-
parent_id: exports_external.string().optional()
|
|
30034
|
-
project_id: exports_external.string().optional()
|
|
30035
|
-
}
|
|
30036
|
-
}, async (
|
|
30005
|
+
name: exports_external.string(),
|
|
30006
|
+
from: exports_external.string().optional(),
|
|
30007
|
+
description: exports_external.string().optional(),
|
|
30008
|
+
parent_id: exports_external.string().optional(),
|
|
30009
|
+
project_id: exports_external.string().optional()
|
|
30010
|
+
}
|
|
30011
|
+
}, async (args) => {
|
|
30012
|
+
const { from: fromParam, name, description, parent_id, project_id } = args;
|
|
30037
30013
|
const agent = resolveIdentity(fromParam);
|
|
30038
30014
|
try {
|
|
30039
30015
|
const sp = createSpace(name, agent, { description, parent_id, project_id });
|
|
@@ -30054,14 +30030,14 @@ server.registerTool("create_space", {
|
|
|
30054
30030
|
}
|
|
30055
30031
|
});
|
|
30056
30032
|
server.registerTool("list_spaces", {
|
|
30057
|
-
|
|
30058
|
-
description: "List spaces with member/message counts. Archived spaces excluded by default.",
|
|
30033
|
+
description: "List spaces with counts.",
|
|
30059
30034
|
inputSchema: {
|
|
30060
|
-
project_id: exports_external.string().optional()
|
|
30061
|
-
parent_id: exports_external.string().optional()
|
|
30062
|
-
include_archived: exports_external.boolean().optional()
|
|
30035
|
+
project_id: exports_external.string().optional(),
|
|
30036
|
+
parent_id: exports_external.string().optional(),
|
|
30037
|
+
include_archived: exports_external.boolean().optional()
|
|
30063
30038
|
}
|
|
30064
|
-
}, async (
|
|
30039
|
+
}, async (args) => {
|
|
30040
|
+
const { project_id, parent_id, include_archived } = args;
|
|
30065
30041
|
const opts = {};
|
|
30066
30042
|
if (project_id)
|
|
30067
30043
|
opts.project_id = project_id;
|
|
@@ -30078,16 +30054,16 @@ server.registerTool("list_spaces", {
|
|
|
30078
30054
|
};
|
|
30079
30055
|
});
|
|
30080
30056
|
server.registerTool("send_to_space", {
|
|
30081
|
-
|
|
30082
|
-
description: "Send a message to a space. All members can see it.",
|
|
30057
|
+
description: "Post a message to a space.",
|
|
30083
30058
|
inputSchema: {
|
|
30084
|
-
|
|
30085
|
-
|
|
30086
|
-
|
|
30087
|
-
priority: exports_external.
|
|
30088
|
-
blocking: exports_external.boolean().optional()
|
|
30089
|
-
}
|
|
30090
|
-
}, async (
|
|
30059
|
+
space: exports_external.string(),
|
|
30060
|
+
content: exports_external.string(),
|
|
30061
|
+
from: exports_external.string().optional(),
|
|
30062
|
+
priority: exports_external.string().optional(),
|
|
30063
|
+
blocking: exports_external.boolean().optional()
|
|
30064
|
+
}
|
|
30065
|
+
}, async (args) => {
|
|
30066
|
+
const { from: fromParam, space, content, priority, blocking } = args;
|
|
30091
30067
|
const from = resolveIdentity(fromParam);
|
|
30092
30068
|
const sp = getSpace(space);
|
|
30093
30069
|
if (!sp) {
|
|
@@ -30110,27 +30086,27 @@ server.registerTool("send_to_space", {
|
|
|
30110
30086
|
};
|
|
30111
30087
|
});
|
|
30112
30088
|
server.registerTool("read_space", {
|
|
30113
|
-
title: "Read Space",
|
|
30114
30089
|
description: "Read messages from a space.",
|
|
30115
30090
|
inputSchema: {
|
|
30116
|
-
space: exports_external.string()
|
|
30117
|
-
since: exports_external.string().optional()
|
|
30118
|
-
limit: exports_external.number().optional()
|
|
30091
|
+
space: exports_external.string(),
|
|
30092
|
+
since: exports_external.string().optional(),
|
|
30093
|
+
limit: exports_external.number().optional()
|
|
30119
30094
|
}
|
|
30120
|
-
}, async (
|
|
30095
|
+
}, async (args) => {
|
|
30096
|
+
const { space, since, limit } = args;
|
|
30121
30097
|
const messages = readMessages({ space, since, limit });
|
|
30122
30098
|
return {
|
|
30123
30099
|
content: [{ type: "text", text: JSON.stringify(messages, null, 2) }]
|
|
30124
30100
|
};
|
|
30125
30101
|
});
|
|
30126
30102
|
server.registerTool("join_space", {
|
|
30127
|
-
|
|
30128
|
-
description: "Join a space to receive messages.",
|
|
30103
|
+
description: "Join a space as a member.",
|
|
30129
30104
|
inputSchema: {
|
|
30130
|
-
|
|
30131
|
-
|
|
30105
|
+
space: exports_external.string(),
|
|
30106
|
+
from: exports_external.string().optional()
|
|
30132
30107
|
}
|
|
30133
|
-
}, async (
|
|
30108
|
+
}, async (args) => {
|
|
30109
|
+
const { from: fromParam, space } = args;
|
|
30134
30110
|
const agent = resolveIdentity(fromParam);
|
|
30135
30111
|
const ok = joinSpace(space, agent);
|
|
30136
30112
|
if (!ok) {
|
|
@@ -30144,13 +30120,13 @@ server.registerTool("join_space", {
|
|
|
30144
30120
|
};
|
|
30145
30121
|
});
|
|
30146
30122
|
server.registerTool("leave_space", {
|
|
30147
|
-
title: "Leave Space",
|
|
30148
30123
|
description: "Leave a space.",
|
|
30149
30124
|
inputSchema: {
|
|
30150
|
-
|
|
30151
|
-
|
|
30125
|
+
space: exports_external.string(),
|
|
30126
|
+
from: exports_external.string().optional()
|
|
30152
30127
|
}
|
|
30153
|
-
}, async (
|
|
30128
|
+
}, async (args) => {
|
|
30129
|
+
const { from: fromParam, space } = args;
|
|
30154
30130
|
const agent = resolveIdentity(fromParam);
|
|
30155
30131
|
const left = leaveSpace(space, agent);
|
|
30156
30132
|
return {
|
|
@@ -30158,15 +30134,15 @@ server.registerTool("leave_space", {
|
|
|
30158
30134
|
};
|
|
30159
30135
|
});
|
|
30160
30136
|
server.registerTool("update_space", {
|
|
30161
|
-
|
|
30162
|
-
description: "Update a space's description, parent, or project.",
|
|
30137
|
+
description: "Update space description or parent.",
|
|
30163
30138
|
inputSchema: {
|
|
30164
|
-
name: exports_external.string()
|
|
30165
|
-
description: exports_external.string().optional()
|
|
30166
|
-
parent_id: exports_external.string().optional()
|
|
30167
|
-
project_id: exports_external.string().optional()
|
|
30139
|
+
name: exports_external.string(),
|
|
30140
|
+
description: exports_external.string().optional(),
|
|
30141
|
+
parent_id: exports_external.string().optional(),
|
|
30142
|
+
project_id: exports_external.string().optional()
|
|
30168
30143
|
}
|
|
30169
|
-
}, async (
|
|
30144
|
+
}, async (args) => {
|
|
30145
|
+
const { name, description, parent_id, project_id } = args;
|
|
30170
30146
|
const updates = {};
|
|
30171
30147
|
if (description !== undefined)
|
|
30172
30148
|
updates.description = description;
|
|
@@ -30187,10 +30163,9 @@ server.registerTool("update_space", {
|
|
|
30187
30163
|
}
|
|
30188
30164
|
});
|
|
30189
30165
|
server.registerTool("archive_space", {
|
|
30190
|
-
|
|
30191
|
-
description: "Archive a space. Hidden from list by default.",
|
|
30166
|
+
description: "Archive a space.",
|
|
30192
30167
|
inputSchema: {
|
|
30193
|
-
name: exports_external.string()
|
|
30168
|
+
name: exports_external.string()
|
|
30194
30169
|
}
|
|
30195
30170
|
}, async ({ name }) => {
|
|
30196
30171
|
try {
|
|
@@ -30206,10 +30181,9 @@ server.registerTool("archive_space", {
|
|
|
30206
30181
|
}
|
|
30207
30182
|
});
|
|
30208
30183
|
server.registerTool("unarchive_space", {
|
|
30209
|
-
|
|
30210
|
-
description: "Unarchive a previously archived space.",
|
|
30184
|
+
description: "Unarchive a space.",
|
|
30211
30185
|
inputSchema: {
|
|
30212
|
-
name: exports_external.string()
|
|
30186
|
+
name: exports_external.string()
|
|
30213
30187
|
}
|
|
30214
30188
|
}, async ({ name }) => {
|
|
30215
30189
|
try {
|
|
@@ -30225,19 +30199,19 @@ server.registerTool("unarchive_space", {
|
|
|
30225
30199
|
}
|
|
30226
30200
|
});
|
|
30227
30201
|
server.registerTool("create_project", {
|
|
30228
|
-
|
|
30229
|
-
description: "Create a new project to organize spaces and agent collaboration.",
|
|
30202
|
+
description: "Create a project for agent collaboration.",
|
|
30230
30203
|
inputSchema: {
|
|
30231
|
-
|
|
30232
|
-
|
|
30233
|
-
description: exports_external.string().optional()
|
|
30234
|
-
path: exports_external.string().optional()
|
|
30235
|
-
repository: exports_external.string().optional()
|
|
30236
|
-
tags: exports_external.string().optional()
|
|
30237
|
-
metadata: exports_external.string().optional()
|
|
30238
|
-
settings: exports_external.string().optional()
|
|
30239
|
-
}
|
|
30240
|
-
}, async (
|
|
30204
|
+
name: exports_external.string(),
|
|
30205
|
+
from: exports_external.string().optional(),
|
|
30206
|
+
description: exports_external.string().optional(),
|
|
30207
|
+
path: exports_external.string().optional(),
|
|
30208
|
+
repository: exports_external.string().optional(),
|
|
30209
|
+
tags: exports_external.string().optional(),
|
|
30210
|
+
metadata: exports_external.string().optional(),
|
|
30211
|
+
settings: exports_external.string().optional()
|
|
30212
|
+
}
|
|
30213
|
+
}, async (args) => {
|
|
30214
|
+
const { from: fromParam, name, description, path, repository, tags, metadata, settings } = args;
|
|
30241
30215
|
const agent = resolveIdentity(fromParam);
|
|
30242
30216
|
let parsedTags;
|
|
30243
30217
|
if (tags) {
|
|
@@ -30300,22 +30274,21 @@ server.registerTool("create_project", {
|
|
|
30300
30274
|
}
|
|
30301
30275
|
});
|
|
30302
30276
|
server.registerTool("list_projects", {
|
|
30303
|
-
|
|
30304
|
-
description: "List all registered projects.",
|
|
30277
|
+
description: "List all projects.",
|
|
30305
30278
|
inputSchema: {
|
|
30306
|
-
status: exports_external.
|
|
30279
|
+
status: exports_external.string().optional()
|
|
30307
30280
|
}
|
|
30308
|
-
}, async (
|
|
30281
|
+
}, async (args) => {
|
|
30282
|
+
const { status } = args;
|
|
30309
30283
|
const projects = listProjects(status ? { status } : undefined);
|
|
30310
30284
|
return {
|
|
30311
30285
|
content: [{ type: "text", text: JSON.stringify(projects, null, 2) }]
|
|
30312
30286
|
};
|
|
30313
30287
|
});
|
|
30314
30288
|
server.registerTool("get_project", {
|
|
30315
|
-
|
|
30316
|
-
description: "Get full details of a project by ID or name.",
|
|
30289
|
+
description: "Get a project by ID or name.",
|
|
30317
30290
|
inputSchema: {
|
|
30318
|
-
id: exports_external.string()
|
|
30291
|
+
id: exports_external.string()
|
|
30319
30292
|
}
|
|
30320
30293
|
}, async ({ id }) => {
|
|
30321
30294
|
let project = getProject(id);
|
|
@@ -30333,20 +30306,20 @@ server.registerTool("get_project", {
|
|
|
30333
30306
|
};
|
|
30334
30307
|
});
|
|
30335
30308
|
server.registerTool("update_project", {
|
|
30336
|
-
|
|
30337
|
-
description: "Update a project's fields.",
|
|
30309
|
+
description: "Update project fields by ID.",
|
|
30338
30310
|
inputSchema: {
|
|
30339
|
-
id: exports_external.string()
|
|
30340
|
-
name: exports_external.string().optional()
|
|
30341
|
-
description: exports_external.string().optional()
|
|
30342
|
-
path: exports_external.string().optional()
|
|
30343
|
-
status: exports_external.
|
|
30344
|
-
repository: exports_external.string().optional()
|
|
30345
|
-
tags: exports_external.string().optional()
|
|
30346
|
-
metadata: exports_external.string().optional()
|
|
30347
|
-
settings: exports_external.string().optional()
|
|
30348
|
-
}
|
|
30349
|
-
}, async (
|
|
30311
|
+
id: exports_external.string(),
|
|
30312
|
+
name: exports_external.string().optional(),
|
|
30313
|
+
description: exports_external.string().optional(),
|
|
30314
|
+
path: exports_external.string().optional(),
|
|
30315
|
+
status: exports_external.string().optional(),
|
|
30316
|
+
repository: exports_external.string().optional(),
|
|
30317
|
+
tags: exports_external.string().optional(),
|
|
30318
|
+
metadata: exports_external.string().optional(),
|
|
30319
|
+
settings: exports_external.string().optional()
|
|
30320
|
+
}
|
|
30321
|
+
}, async (args) => {
|
|
30322
|
+
const { id, name, description, path, status, repository, tags, metadata, settings } = args;
|
|
30350
30323
|
const updates = {};
|
|
30351
30324
|
if (name !== undefined)
|
|
30352
30325
|
updates.name = name;
|
|
@@ -30401,10 +30374,9 @@ server.registerTool("update_project", {
|
|
|
30401
30374
|
}
|
|
30402
30375
|
});
|
|
30403
30376
|
server.registerTool("delete_project", {
|
|
30404
|
-
|
|
30405
|
-
description: "Delete a project permanently. Fails if spaces reference it.",
|
|
30377
|
+
description: "Delete a project permanently.",
|
|
30406
30378
|
inputSchema: {
|
|
30407
|
-
id: exports_external.string()
|
|
30379
|
+
id: exports_external.string()
|
|
30408
30380
|
}
|
|
30409
30381
|
}, async ({ id }) => {
|
|
30410
30382
|
try {
|
|
@@ -30426,13 +30398,13 @@ server.registerTool("delete_project", {
|
|
|
30426
30398
|
}
|
|
30427
30399
|
});
|
|
30428
30400
|
server.registerTool("delete_message", {
|
|
30429
|
-
|
|
30430
|
-
description: "Delete a message. Only the sender can delete their own messages.",
|
|
30401
|
+
description: "Delete a message (sender only).",
|
|
30431
30402
|
inputSchema: {
|
|
30432
|
-
|
|
30433
|
-
|
|
30403
|
+
id: exports_external.number(),
|
|
30404
|
+
from: exports_external.string().optional()
|
|
30434
30405
|
}
|
|
30435
|
-
}, async (
|
|
30406
|
+
}, async (args) => {
|
|
30407
|
+
const { from: fromParam, id } = args;
|
|
30436
30408
|
const agent = resolveIdentity(fromParam);
|
|
30437
30409
|
const deleted = deleteMessage(id, agent);
|
|
30438
30410
|
if (!deleted) {
|
|
@@ -30446,14 +30418,14 @@ server.registerTool("delete_message", {
|
|
|
30446
30418
|
};
|
|
30447
30419
|
});
|
|
30448
30420
|
server.registerTool("edit_message", {
|
|
30449
|
-
|
|
30450
|
-
description: "Edit a message's content. Only the sender can edit their own messages.",
|
|
30421
|
+
description: "Edit message content (sender only).",
|
|
30451
30422
|
inputSchema: {
|
|
30452
|
-
|
|
30453
|
-
|
|
30454
|
-
|
|
30423
|
+
id: exports_external.number(),
|
|
30424
|
+
content: exports_external.string(),
|
|
30425
|
+
from: exports_external.string().optional()
|
|
30455
30426
|
}
|
|
30456
|
-
}, async (
|
|
30427
|
+
}, async (args) => {
|
|
30428
|
+
const { from: fromParam, id, content } = args;
|
|
30457
30429
|
const agent = resolveIdentity(fromParam);
|
|
30458
30430
|
const msg = editMessage(id, agent, content);
|
|
30459
30431
|
if (!msg) {
|
|
@@ -30467,10 +30439,9 @@ server.registerTool("edit_message", {
|
|
|
30467
30439
|
};
|
|
30468
30440
|
});
|
|
30469
30441
|
server.registerTool("pin_message", {
|
|
30470
|
-
|
|
30471
|
-
description: "Pin a message. Retrieve pinned messages with get_pinned_messages.",
|
|
30442
|
+
description: "Pin a message.",
|
|
30472
30443
|
inputSchema: {
|
|
30473
|
-
id: exports_external.number()
|
|
30444
|
+
id: exports_external.number()
|
|
30474
30445
|
}
|
|
30475
30446
|
}, async ({ id }) => {
|
|
30476
30447
|
const msg = pinMessage(id);
|
|
@@ -30485,10 +30456,9 @@ server.registerTool("pin_message", {
|
|
|
30485
30456
|
};
|
|
30486
30457
|
});
|
|
30487
30458
|
server.registerTool("unpin_message", {
|
|
30488
|
-
|
|
30489
|
-
description: "Unpin a previously pinned message.",
|
|
30459
|
+
description: "Unpin a message.",
|
|
30490
30460
|
inputSchema: {
|
|
30491
|
-
id: exports_external.number()
|
|
30461
|
+
id: exports_external.number()
|
|
30492
30462
|
}
|
|
30493
30463
|
}, async ({ id }) => {
|
|
30494
30464
|
const msg = unpinMessage(id);
|
|
@@ -30503,27 +30473,27 @@ server.registerTool("unpin_message", {
|
|
|
30503
30473
|
};
|
|
30504
30474
|
});
|
|
30505
30475
|
server.registerTool("get_pinned_messages", {
|
|
30506
|
-
|
|
30507
|
-
description: "Retrieve pinned messages, optionally filtered by space or session.",
|
|
30476
|
+
description: "Get pinned messages by space or session.",
|
|
30508
30477
|
inputSchema: {
|
|
30509
|
-
space: exports_external.string().optional()
|
|
30510
|
-
session_id: exports_external.string().optional()
|
|
30511
|
-
limit: exports_external.number().optional()
|
|
30478
|
+
space: exports_external.string().optional(),
|
|
30479
|
+
session_id: exports_external.string().optional(),
|
|
30480
|
+
limit: exports_external.number().optional()
|
|
30512
30481
|
}
|
|
30513
|
-
}, async (
|
|
30482
|
+
}, async (args) => {
|
|
30483
|
+
const { space, session_id, limit } = args;
|
|
30514
30484
|
const messages = getPinnedMessages({ space, session_id, limit });
|
|
30515
30485
|
return {
|
|
30516
30486
|
content: [{ type: "text", text: JSON.stringify(messages, null, 2) }]
|
|
30517
30487
|
};
|
|
30518
30488
|
});
|
|
30519
30489
|
server.registerTool("heartbeat", {
|
|
30520
|
-
|
|
30521
|
-
description: "Send a heartbeat to indicate agent is alive. Optionally set a status.",
|
|
30490
|
+
description: "Send presence heartbeat.",
|
|
30522
30491
|
inputSchema: {
|
|
30523
|
-
from: exports_external.string().optional()
|
|
30524
|
-
status: exports_external.string().optional()
|
|
30492
|
+
from: exports_external.string().optional(),
|
|
30493
|
+
status: exports_external.string().optional()
|
|
30525
30494
|
}
|
|
30526
|
-
}, async (
|
|
30495
|
+
}, async (args) => {
|
|
30496
|
+
const { from: fromParam, status } = args;
|
|
30527
30497
|
const agent = resolveIdentity(fromParam);
|
|
30528
30498
|
heartbeat(agent, status);
|
|
30529
30499
|
return {
|
|
@@ -30531,24 +30501,24 @@ server.registerTool("heartbeat", {
|
|
|
30531
30501
|
};
|
|
30532
30502
|
});
|
|
30533
30503
|
server.registerTool("list_agents", {
|
|
30534
|
-
|
|
30535
|
-
description: "List agents with presence status (name, status, last_seen, online).",
|
|
30504
|
+
description: "List agents with presence status.",
|
|
30536
30505
|
inputSchema: {
|
|
30537
|
-
online_only: exports_external.boolean().optional()
|
|
30506
|
+
online_only: exports_external.boolean().optional()
|
|
30538
30507
|
}
|
|
30539
|
-
}, async (
|
|
30508
|
+
}, async (args) => {
|
|
30509
|
+
const { online_only } = args;
|
|
30540
30510
|
const agents = listAgents({ online_only });
|
|
30541
30511
|
return {
|
|
30542
30512
|
content: [{ type: "text", text: JSON.stringify(agents, null, 2) }]
|
|
30543
30513
|
};
|
|
30544
30514
|
});
|
|
30545
30515
|
server.registerTool("get_blockers", {
|
|
30546
|
-
|
|
30547
|
-
description: "Check for unread blocking messages targeting you. Must acknowledge before continuing.",
|
|
30516
|
+
description: "Check for unread blocking messages.",
|
|
30548
30517
|
inputSchema: {
|
|
30549
|
-
from: exports_external.string().optional()
|
|
30518
|
+
from: exports_external.string().optional()
|
|
30550
30519
|
}
|
|
30551
|
-
}, async (
|
|
30520
|
+
}, async (args) => {
|
|
30521
|
+
const { from: fromParam } = args;
|
|
30552
30522
|
const agent = resolveIdentity(fromParam);
|
|
30553
30523
|
const blockers = getUnreadBlockers(agent);
|
|
30554
30524
|
return {
|
|
@@ -30556,13 +30526,13 @@ server.registerTool("get_blockers", {
|
|
|
30556
30526
|
};
|
|
30557
30527
|
});
|
|
30558
30528
|
server.registerTool("remove_agent", {
|
|
30559
|
-
|
|
30560
|
-
description: "Remove an agent from the presence list.",
|
|
30529
|
+
description: "Remove an agent from presence.",
|
|
30561
30530
|
inputSchema: {
|
|
30562
|
-
from: exports_external.string().optional()
|
|
30563
|
-
agent: exports_external.string().optional()
|
|
30531
|
+
from: exports_external.string().optional(),
|
|
30532
|
+
agent: exports_external.string().optional()
|
|
30564
30533
|
}
|
|
30565
|
-
}, async (
|
|
30534
|
+
}, async (args) => {
|
|
30535
|
+
const { from: fromParam, agent: targetAgent } = args;
|
|
30566
30536
|
const self = resolveIdentity(fromParam);
|
|
30567
30537
|
const agent = targetAgent?.trim() || self;
|
|
30568
30538
|
const removed = removePresence(agent);
|
|
@@ -30577,13 +30547,13 @@ server.registerTool("remove_agent", {
|
|
|
30577
30547
|
};
|
|
30578
30548
|
});
|
|
30579
30549
|
server.registerTool("rename_agent", {
|
|
30580
|
-
|
|
30581
|
-
description: "Rename an agent in the presence list. Defaults to renaming yourself.",
|
|
30550
|
+
description: "Rename your agent in presence.",
|
|
30582
30551
|
inputSchema: {
|
|
30583
|
-
|
|
30584
|
-
|
|
30552
|
+
new_name: exports_external.string(),
|
|
30553
|
+
from: exports_external.string().optional()
|
|
30585
30554
|
}
|
|
30586
|
-
}, async (
|
|
30555
|
+
}, async (args) => {
|
|
30556
|
+
const { from: fromParam, new_name } = args;
|
|
30587
30557
|
const oldName = resolveIdentity(fromParam);
|
|
30588
30558
|
const newName = new_name.trim();
|
|
30589
30559
|
if (!newName) {
|
|
@@ -30610,6 +30580,97 @@ server.registerTool("rename_agent", {
|
|
|
30610
30580
|
};
|
|
30611
30581
|
}
|
|
30612
30582
|
});
|
|
30583
|
+
server.registerTool("search_tools", {
|
|
30584
|
+
description: "List tool names by keyword.",
|
|
30585
|
+
inputSchema: {
|
|
30586
|
+
query: exports_external.string().optional()
|
|
30587
|
+
}
|
|
30588
|
+
}, async (args) => {
|
|
30589
|
+
const { query } = args;
|
|
30590
|
+
const all = [
|
|
30591
|
+
"send_message",
|
|
30592
|
+
"read_messages",
|
|
30593
|
+
"list_sessions",
|
|
30594
|
+
"reply",
|
|
30595
|
+
"mark_read",
|
|
30596
|
+
"search_messages",
|
|
30597
|
+
"export_messages",
|
|
30598
|
+
"create_space",
|
|
30599
|
+
"list_spaces",
|
|
30600
|
+
"send_to_space",
|
|
30601
|
+
"read_space",
|
|
30602
|
+
"join_space",
|
|
30603
|
+
"leave_space",
|
|
30604
|
+
"update_space",
|
|
30605
|
+
"archive_space",
|
|
30606
|
+
"unarchive_space",
|
|
30607
|
+
"create_project",
|
|
30608
|
+
"list_projects",
|
|
30609
|
+
"get_project",
|
|
30610
|
+
"update_project",
|
|
30611
|
+
"delete_project",
|
|
30612
|
+
"delete_message",
|
|
30613
|
+
"edit_message",
|
|
30614
|
+
"pin_message",
|
|
30615
|
+
"unpin_message",
|
|
30616
|
+
"get_pinned_messages",
|
|
30617
|
+
"heartbeat",
|
|
30618
|
+
"list_agents",
|
|
30619
|
+
"get_blockers",
|
|
30620
|
+
"remove_agent",
|
|
30621
|
+
"rename_agent",
|
|
30622
|
+
"search_tools",
|
|
30623
|
+
"describe_tools"
|
|
30624
|
+
];
|
|
30625
|
+
const q = query?.toLowerCase();
|
|
30626
|
+
const matches = q ? all.filter((n) => n.includes(q)) : all;
|
|
30627
|
+
return { content: [{ type: "text", text: matches.join(", ") }] };
|
|
30628
|
+
});
|
|
30629
|
+
server.registerTool("describe_tools", {
|
|
30630
|
+
description: "Get descriptions for tools by name.",
|
|
30631
|
+
inputSchema: {
|
|
30632
|
+
names: exports_external.array(exports_external.string())
|
|
30633
|
+
}
|
|
30634
|
+
}, async ({ names }) => {
|
|
30635
|
+
const descriptions = {
|
|
30636
|
+
send_message: "Send DM to agent. Required: to, content. Optional: from?, priority?(low|normal|high|urgent), blocking?",
|
|
30637
|
+
read_messages: "Read messages with filters. Optional: session_id?, from?, to?, space?, since?(ISO), limit?, unread_only?",
|
|
30638
|
+
list_sessions: "List all DM sessions. Optional: agent?(filter by participant)",
|
|
30639
|
+
reply: "Reply to a message in same session. Required: message_id, content. Optional: from?",
|
|
30640
|
+
mark_read: "Mark messages as read. Optional: from?, ids?(array), all?(bool \u2014 mark all unread)",
|
|
30641
|
+
search_messages: "Full-text search messages. Required: query. Optional: space?, from?, to?, limit?",
|
|
30642
|
+
export_messages: "Export messages as JSON or CSV. Optional: space?, session_id?, from?, since?, until?, format?(json|csv)",
|
|
30643
|
+
create_space: "Create space and auto-join. Required: name. Optional: from?, description?, parent_id?(max 3 levels), project_id?",
|
|
30644
|
+
list_spaces: "List spaces with member/message counts. Optional: project_id?, parent_id?(use 'null' for top-level), include_archived?",
|
|
30645
|
+
send_to_space: "Post message to space. Required: space, content. Optional: from?, priority?(low|normal|high|urgent), blocking?",
|
|
30646
|
+
read_space: "Read messages in a space. Required: space. Optional: since?(ISO), limit?",
|
|
30647
|
+
join_space: "Join a space. Required: space. Optional: from?",
|
|
30648
|
+
leave_space: "Leave a space. Required: space. Optional: from?",
|
|
30649
|
+
update_space: "Update space fields. Required: name. Optional: description?, parent_id?(use 'null' to remove), project_id?(use 'null' to remove)",
|
|
30650
|
+
archive_space: "Archive a space (hidden from default list). Required: name",
|
|
30651
|
+
unarchive_space: "Restore archived space. Required: name",
|
|
30652
|
+
create_project: "Create a project. Required: name. Optional: from?, description?, path?, repository?, tags?(JSON array), metadata?(JSON), settings?(JSON)",
|
|
30653
|
+
list_projects: "List projects. Optional: status?(active|archived)",
|
|
30654
|
+
get_project: "Get project by UUID or name. Required: id",
|
|
30655
|
+
update_project: "Update project fields. Required: id. Optional: name?, description?, path?, status?(active|archived), repository?, tags?(JSON), metadata?(JSON), settings?(JSON)",
|
|
30656
|
+
delete_project: "Delete project (fails if spaces reference it). Required: id",
|
|
30657
|
+
delete_message: "Delete a message (sender only). Required: id. Optional: from?",
|
|
30658
|
+
edit_message: "Edit message content (sender only). Required: id, content. Optional: from?",
|
|
30659
|
+
pin_message: "Pin a message. Required: id",
|
|
30660
|
+
unpin_message: "Unpin a message. Required: id",
|
|
30661
|
+
get_pinned_messages: "Get pinned messages. Optional: space?, session_id?, limit?",
|
|
30662
|
+
heartbeat: "Register/refresh agent presence. Optional: from?, status?(online|busy|idle, default: online)",
|
|
30663
|
+
list_agents: "List agents with presence timestamps. Optional: online_only?(only agents seen in last 60s)",
|
|
30664
|
+
get_blockers: "Get unread blocking messages for agent. Optional: from?",
|
|
30665
|
+
remove_agent: "Remove agent from presence list. Optional: from?, agent?(defaults to self)",
|
|
30666
|
+
rename_agent: "Rename agent in presence list. Required: new_name. Optional: from?",
|
|
30667
|
+
search_tools: "Search tool names by keyword. Optional: query?",
|
|
30668
|
+
describe_tools: "Get full descriptions for tools. Required: names(array of tool names)"
|
|
30669
|
+
};
|
|
30670
|
+
const result = names.map((n) => `${n}: ${descriptions[n] || "See tool schema"}`).join(`
|
|
30671
|
+
`);
|
|
30672
|
+
return { content: [{ type: "text", text: result }] };
|
|
30673
|
+
});
|
|
30613
30674
|
async function startMcpServer() {
|
|
30614
30675
|
const transport = new StdioServerTransport;
|
|
30615
30676
|
await server.connect(transport);
|