@agentsean/mcp 1.0.0
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/LICENSE +661 -0
- package/dist/client.d.ts +19 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +44 -0
- package/dist/client.js.map +1 -0
- package/dist/formatters.d.ts +31 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +31 -0
- package/dist/formatters.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +90 -0
- package/dist/server.js.map +1 -0
- package/dist/table.d.ts +20 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +61 -0
- package/dist/table.js.map +1 -0
- package/dist/tools.d.ts +13 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +351 -0
- package/dist/tools.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACxE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9E,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB,GAAG,aAAa,CA4ChB"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP *client* so Sean can consume OpenSEO if the user already runs it.
|
|
3
|
+
* LEARN_FROM OpenSEO's streamable-HTTP transport; we speak JSON-RPC over POST.
|
|
4
|
+
* Agent Sean is not a fork of OpenSEO.
|
|
5
|
+
*/
|
|
6
|
+
export function createOpenSeoClient(opts) {
|
|
7
|
+
const fetchFn = opts.fetch ?? fetch;
|
|
8
|
+
let nextId = 1;
|
|
9
|
+
async function rpc(method, params) {
|
|
10
|
+
const headers = {
|
|
11
|
+
"content-type": "application/json",
|
|
12
|
+
accept: "application/json, text/event-stream",
|
|
13
|
+
};
|
|
14
|
+
if (opts.apiKey)
|
|
15
|
+
headers["authorization"] = `Bearer ${opts.apiKey}`;
|
|
16
|
+
const res = await fetchFn(opts.url, {
|
|
17
|
+
method: "POST",
|
|
18
|
+
headers,
|
|
19
|
+
body: JSON.stringify({
|
|
20
|
+
jsonrpc: "2.0",
|
|
21
|
+
id: nextId++,
|
|
22
|
+
method,
|
|
23
|
+
...(params ? { params } : {}),
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
if (!res.ok)
|
|
27
|
+
throw new Error(`OpenSEO MCP HTTP ${res.status}`);
|
|
28
|
+
const json = (await res.json());
|
|
29
|
+
if (json.error)
|
|
30
|
+
throw new Error(json.error.message ?? "OpenSEO MCP error");
|
|
31
|
+
return json.result;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
url: opts.url,
|
|
35
|
+
async listTools() {
|
|
36
|
+
const result = (await rpc("tools/list"));
|
|
37
|
+
return result.tools ?? [];
|
|
38
|
+
},
|
|
39
|
+
async callTool(name, args) {
|
|
40
|
+
return rpc("tools/call", { name, arguments: args ?? {} });
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,UAAU,mBAAmB,CAAC,IAInC;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IACpC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,UAAU,GAAG,CAChB,MAAc,EACd,MAAgC;QAEhC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,qCAAqC;SAC9C,CAAC;QACF,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,MAAM,EAAE;gBACZ,MAAM;gBACN,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;QACF,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,KAAK,CAAC,SAAS;YACb,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,CAEtC,CAAC;YACF,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI;YACvB,OAAO,GAAG,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type CallToolResult = {
|
|
2
|
+
content: Array<{
|
|
3
|
+
type: "text";
|
|
4
|
+
text: string;
|
|
5
|
+
}>;
|
|
6
|
+
structuredContent?: Record<string, unknown>;
|
|
7
|
+
_meta?: Record<string, unknown>;
|
|
8
|
+
isError?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type McpResponseMeta = {
|
|
11
|
+
url?: string;
|
|
12
|
+
projectId?: string;
|
|
13
|
+
runId?: string;
|
|
14
|
+
creditsCharged?: number;
|
|
15
|
+
creditsRemaining?: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function mcpResponse<T extends Record<string, unknown>>(opts: {
|
|
18
|
+
text: string;
|
|
19
|
+
meta?: McpResponseMeta;
|
|
20
|
+
structuredContent: T;
|
|
21
|
+
}): CallToolResult & {
|
|
22
|
+
structuredContent: T & {
|
|
23
|
+
meta?: Record<string, unknown>;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export declare function mcpResponse(opts: {
|
|
27
|
+
text: string;
|
|
28
|
+
meta?: McpResponseMeta;
|
|
29
|
+
}): CallToolResult;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAOF,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,iBAAiB,EAAE,CAAC,CAAC;CACtB,GAAG,cAAc,GAAG;IACnB,iBAAiB,EAAE,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC3D,CAAC;AACF,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,GAAG,cAAc,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Copied from OpenSEO (every-app/open-seo) src/server/mcp/formatters.ts
|
|
2
|
+
// under the MIT License. Copyright (c) 2026 Ben Senescu and contributors.
|
|
3
|
+
// COPY_VERBATIM except the CallToolResult import: OpenSEO used
|
|
4
|
+
// `@modelcontextprotocol/server`; Sean's MCP is stdio-first and uses a local
|
|
5
|
+
// type matching the MCP spec so we do not take a Workers MCP runtime.
|
|
6
|
+
export function mcpResponse(opts) {
|
|
7
|
+
const result = {
|
|
8
|
+
content: [{ type: "text", text: opts.text }],
|
|
9
|
+
};
|
|
10
|
+
let meta;
|
|
11
|
+
if (opts.meta) {
|
|
12
|
+
meta = {};
|
|
13
|
+
for (const [key, value] of Object.entries(opts.meta)) {
|
|
14
|
+
if (value !== undefined)
|
|
15
|
+
meta[key] = value;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const hasMeta = meta != null && Object.keys(meta).length > 0;
|
|
19
|
+
if (opts.structuredContent) {
|
|
20
|
+
result.structuredContent =
|
|
21
|
+
hasMeta && meta ? { ...opts.structuredContent, meta } : opts.structuredContent;
|
|
22
|
+
}
|
|
23
|
+
else if (hasMeta && meta) {
|
|
24
|
+
result.structuredContent = { meta };
|
|
25
|
+
}
|
|
26
|
+
if (hasMeta && meta) {
|
|
27
|
+
result._meta = meta;
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,+DAA+D;AAC/D,6EAA6E;AAC7E,sEAAsE;AAiCtE,MAAM,UAAU,WAAW,CAAC,IAI3B;IACC,MAAM,MAAM,GAAmB;QAC7B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;KAC7C,CAAC;IACF,IAAI,IAAyC,CAAC;IAC9C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,GAAG,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,IAAI,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,MAAM,CAAC,iBAAiB;YACtB,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACnF,CAAC;SAAM,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,CAAC,iBAAiB,GAAG,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { formatMcpCell, formatMcpTable, truncatedCell, readPath, type McpTableColumn, } from "./table.js";
|
|
2
|
+
export { mcpResponse, type CallToolResult } from "./formatters.js";
|
|
3
|
+
export { MCP_TOOLS, callTool, type McpTool, type ToolContext } from "./tools.js";
|
|
4
|
+
export { MCP_PROTOCOL, handleMcpMessage, handleMcpMessageAsync, serveStdio, } from "./server.js";
|
|
5
|
+
export { createOpenSeoClient, type OpenSeoClient } from "./client.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,QAAQ,EACR,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { formatMcpCell, formatMcpTable, truncatedCell, readPath, } from "./table.js";
|
|
2
|
+
export { mcpResponse } from "./formatters.js";
|
|
3
|
+
export { MCP_TOOLS, callTool } from "./tools.js";
|
|
4
|
+
export { MCP_PROTOCOL, handleMcpMessage, handleMcpMessageAsync, serveStdio, } from "./server.js";
|
|
5
|
+
export { createOpenSeoClient } from "./client.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,QAAQ,GAET,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAuB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAkC,MAAM,YAAY,CAAC;AACjF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ToolContext } from "./tools.js";
|
|
2
|
+
export declare const MCP_PROTOCOL = "2024-11-05";
|
|
3
|
+
type JsonRpc = {
|
|
4
|
+
jsonrpc: "2.0";
|
|
5
|
+
id?: string | number | null;
|
|
6
|
+
method?: string;
|
|
7
|
+
params?: unknown;
|
|
8
|
+
result?: unknown;
|
|
9
|
+
error?: {
|
|
10
|
+
code: number;
|
|
11
|
+
message: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export declare function handleMcpMessage(_ctx: ToolContext, msg: JsonRpc): JsonRpc | null;
|
|
15
|
+
export declare function handleMcpMessageAsync(ctx: ToolContext, msg: JsonRpc): Promise<JsonRpc | null>;
|
|
16
|
+
export declare function serveStdio(ctx: ToolContext, stdin?: NodeJS.ReadStream & {
|
|
17
|
+
fd: 0;
|
|
18
|
+
}, stdout?: NodeJS.WriteStream & {
|
|
19
|
+
fd: 1;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnE,eAAO,MAAM,YAAY,eAAe,CAAC;AAEzC,KAAK,OAAO,GAAG;IACb,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAiDhF;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAUzB;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,WAAW,EAChB,KAAK;;CAAgB,EACrB,MAAM;;CAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { MCP_TOOLS, callTool } from "./tools.js";
|
|
2
|
+
export const MCP_PROTOCOL = "2024-11-05";
|
|
3
|
+
export function handleMcpMessage(_ctx, msg) {
|
|
4
|
+
if (msg.method === "notifications/initialized" ||
|
|
5
|
+
msg.method === "notifications/cancelled") {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const id = msg.id ?? null;
|
|
9
|
+
if (msg.method === "initialize") {
|
|
10
|
+
return {
|
|
11
|
+
jsonrpc: "2.0",
|
|
12
|
+
id,
|
|
13
|
+
result: {
|
|
14
|
+
protocolVersion: MCP_PROTOCOL,
|
|
15
|
+
capabilities: { tools: {} },
|
|
16
|
+
serverInfo: { name: "agentsean", version: "2026.9.0" },
|
|
17
|
+
instructions: "Agent Sean MCP. Demand-side intelligence from GSC + Bing by default. DataForSEO upgrades in place. Sean never scrapes Google. The LLM never holds write credentials.",
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (msg.method === "ping") {
|
|
22
|
+
return { jsonrpc: "2.0", id, result: {} };
|
|
23
|
+
}
|
|
24
|
+
if (msg.method === "tools/list") {
|
|
25
|
+
return {
|
|
26
|
+
jsonrpc: "2.0",
|
|
27
|
+
id,
|
|
28
|
+
result: {
|
|
29
|
+
tools: MCP_TOOLS.map((t) => ({
|
|
30
|
+
name: t.name,
|
|
31
|
+
description: t.description,
|
|
32
|
+
inputSchema: t.inputSchema,
|
|
33
|
+
})),
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (msg.method === "tools/call") {
|
|
38
|
+
return {
|
|
39
|
+
jsonrpc: "2.0",
|
|
40
|
+
id,
|
|
41
|
+
error: { code: -32603, message: "tools/call requires handleMcpMessageAsync" },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
jsonrpc: "2.0",
|
|
46
|
+
id,
|
|
47
|
+
error: { code: -32601, message: `Method not found: ${msg.method ?? "unknown"}` },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export async function handleMcpMessageAsync(ctx, msg) {
|
|
51
|
+
if (msg.method === "tools/call") {
|
|
52
|
+
const params = (msg.params ?? {});
|
|
53
|
+
const result = await callTool(ctx, params.name ?? "", params.arguments ?? {});
|
|
54
|
+
return { jsonrpc: "2.0", id: msg.id ?? null, result };
|
|
55
|
+
}
|
|
56
|
+
return handleMcpMessage(ctx, msg);
|
|
57
|
+
}
|
|
58
|
+
export async function serveStdio(ctx, stdin = process.stdin, stdout = process.stdout) {
|
|
59
|
+
stdin.setEncoding("utf8");
|
|
60
|
+
let buf = "";
|
|
61
|
+
const write = (msg) => {
|
|
62
|
+
stdout.write(JSON.stringify(msg) + "\n");
|
|
63
|
+
};
|
|
64
|
+
for await (const chunk of stdin) {
|
|
65
|
+
buf += chunk;
|
|
66
|
+
let idx;
|
|
67
|
+
while ((idx = buf.indexOf("\n")) >= 0) {
|
|
68
|
+
const line = buf.slice(0, idx).trim();
|
|
69
|
+
buf = buf.slice(idx + 1);
|
|
70
|
+
if (!line)
|
|
71
|
+
continue;
|
|
72
|
+
let parsed;
|
|
73
|
+
try {
|
|
74
|
+
parsed = JSON.parse(line);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
write({
|
|
78
|
+
jsonrpc: "2.0",
|
|
79
|
+
id: null,
|
|
80
|
+
error: { code: -32700, message: "Parse error" },
|
|
81
|
+
});
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const reply = await handleMcpMessageAsync(ctx, parsed);
|
|
85
|
+
if (reply)
|
|
86
|
+
write(reply);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/table.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type McpTableColumn<T> = {
|
|
2
|
+
header: string;
|
|
3
|
+
value: (row: T) => unknown;
|
|
4
|
+
/** Override the default cell formatting for this column. */
|
|
5
|
+
format?: (value: unknown) => string;
|
|
6
|
+
};
|
|
7
|
+
/** Format a single cell. Nullish/empty -> "—"; integers stay exact; other
|
|
8
|
+
* numbers get 2 decimals; strings are collapsed to a single line so a stray
|
|
9
|
+
* newline can't break the table layout. */
|
|
10
|
+
export declare function formatMcpCell(value: unknown): string;
|
|
11
|
+
/** Column `format` that truncates long text after normal cell formatting, so
|
|
12
|
+
* provider prose can't dominate the table (full text stays in
|
|
13
|
+
* structuredContent). */
|
|
14
|
+
export declare function truncatedCell(maxLength: number): (value: unknown) => string;
|
|
15
|
+
/** Render rows as a `header | header` table with one line per row. */
|
|
16
|
+
export declare function formatMcpTable<T>(rows: readonly T[], columns: readonly McpTableColumn<T>[]): string;
|
|
17
|
+
/** Walk a chain of keys through nested unknown records (provider rows).
|
|
18
|
+
* Returns undefined if any hop isn't an object. */
|
|
19
|
+
export declare function readPath(source: unknown, ...path: string[]): unknown;
|
|
20
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC,CAAC;AAEF;;4CAE4C;AAC5C,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAgBpD;AAED;;0BAE0B;AAC1B,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,IACrC,OAAO,OAAO,KAAG,MAAM,CAIhC;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,OAAO,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,GACpC,MAAM,CAWR;AAED;oDACoD;AACpD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAOpE"}
|
package/dist/table.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Copied from OpenSEO (every-app/open-seo) src/server/mcp/table.ts
|
|
2
|
+
// under the MIT License. Copyright (c) 2026 Ben Senescu and contributors.
|
|
3
|
+
// COPY_VERBATIM — token-efficient MCP table rendering.
|
|
4
|
+
/** Format a single cell. Nullish/empty -> "—"; integers stay exact; other
|
|
5
|
+
* numbers get 2 decimals; strings are collapsed to a single line so a stray
|
|
6
|
+
* newline can't break the table layout. */
|
|
7
|
+
export function formatMcpCell(value) {
|
|
8
|
+
if (value == null || value === "")
|
|
9
|
+
return "—";
|
|
10
|
+
if (typeof value === "number") {
|
|
11
|
+
if (!Number.isFinite(value))
|
|
12
|
+
return "—";
|
|
13
|
+
return Number.isInteger(value) ? String(value) : value.toFixed(2);
|
|
14
|
+
}
|
|
15
|
+
if (typeof value === "boolean")
|
|
16
|
+
return value ? "yes" : "no";
|
|
17
|
+
if (typeof value === "string")
|
|
18
|
+
return value.replace(/\s+/g, " ").trim();
|
|
19
|
+
if (typeof value === "bigint")
|
|
20
|
+
return value.toString();
|
|
21
|
+
// Arrays/objects would stringify to "[object Object]"; emit compact JSON so a
|
|
22
|
+
// stray nested value still reads as something in the text table.
|
|
23
|
+
try {
|
|
24
|
+
return JSON.stringify(value) ?? "—";
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return "—";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Column `format` that truncates long text after normal cell formatting, so
|
|
31
|
+
* provider prose can't dominate the table (full text stays in
|
|
32
|
+
* structuredContent). */
|
|
33
|
+
export function truncatedCell(maxLength) {
|
|
34
|
+
return (value) => {
|
|
35
|
+
const cell = formatMcpCell(value);
|
|
36
|
+
return cell.length > maxLength ? `${cell.slice(0, maxLength - 1)}…` : cell;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Render rows as a `header | header` table with one line per row. */
|
|
40
|
+
export function formatMcpTable(rows, columns) {
|
|
41
|
+
const headerLine = columns.map((column) => column.header).join(" | ");
|
|
42
|
+
const rowLines = rows.map((row) => columns
|
|
43
|
+
.map((column) => {
|
|
44
|
+
const raw = column.value(row);
|
|
45
|
+
return column.format ? column.format(raw) : formatMcpCell(raw);
|
|
46
|
+
})
|
|
47
|
+
.join(" | "));
|
|
48
|
+
return [headerLine, ...rowLines].join("\n");
|
|
49
|
+
}
|
|
50
|
+
/** Walk a chain of keys through nested unknown records (provider rows).
|
|
51
|
+
* Returns undefined if any hop isn't an object. */
|
|
52
|
+
export function readPath(source, ...path) {
|
|
53
|
+
let current = source;
|
|
54
|
+
for (const key of path) {
|
|
55
|
+
if (typeof current !== "object" || current === null)
|
|
56
|
+
return undefined;
|
|
57
|
+
current = Reflect.get(current, key);
|
|
58
|
+
}
|
|
59
|
+
return current;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,0EAA0E;AAC1E,uDAAuD;AASvD;;4CAE4C;AAC5C,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACxC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IACvD,8EAA8E;IAC9E,iEAAiE;IACjE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;0BAE0B;AAC1B,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,CAAC,KAAc,EAAU,EAAE;QAChC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAC5B,IAAkB,EAClB,OAAqC;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAChC,OAAO;SACJ,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC,CAAC;SACD,IAAI,CAAC,KAAK,CAAC,CACf,CAAC;IACF,OAAO,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;oDACoD;AACpD,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,GAAG,IAAc;IACzD,IAAI,OAAO,GAAY,MAAM,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACtE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type SqliteDatabase } from "@agentsean/db";
|
|
2
|
+
import { type CallToolResult } from "./formatters.js";
|
|
3
|
+
export type McpTool = {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
export declare const MCP_TOOLS: McpTool[];
|
|
9
|
+
export type ToolContext = {
|
|
10
|
+
db: SqliteDatabase;
|
|
11
|
+
};
|
|
12
|
+
export declare function callTool(ctx: ToolContext, name: string, args: Record<string, unknown>): Promise<CallToolResult>;
|
|
13
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAWpF,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGnE,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,OAAO,EA2F9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,cAAc,CAAC;CACpB,CAAC;AAEF,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,cAAc,CAAC,CA4BzB"}
|