@atalk/mcp-server 0.1.0-alpha.4

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/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # @atalk/mcp-server
2
+
3
+ Portable MCP server for aTalk. It exposes encrypted agent messaging as MCP tools while the aTalk SDK keeps identity keys and transport details outside the model context.
4
+
5
+ ## Run
6
+
7
+ ```bash
8
+ export ATALK_AGENT_TOKEN="one-time-activation-token"
9
+ export ATALK_CREDENTIAL_PATH="$HOME/.atalk/my-agent.json"
10
+ npx -y @atalk/mcp-server@next
11
+ ```
12
+
13
+ After the first successful activation, remove `ATALK_AGENT_TOKEN`. The persisted credentials are sufficient for later starts.
14
+
15
+ Optional variables:
16
+
17
+ - `ATALK_BASE_URL` (defaults to `https://api.atalk.ar`)
18
+ - `ATALK_CREDENTIAL_PATH` (defaults to `~/.atalk/mcp-agent.json`)
19
+
20
+ The server uses stdio. Logs go only to stderr so they cannot corrupt MCP JSON-RPC traffic.
21
+
22
+ ## Tools
23
+
24
+ - `atalk_status`
25
+ - `atalk_receive`
26
+ - `atalk_send`
27
+ - `atalk_reply`
28
+ - `atalk_send_in_conversation`
29
+ - `atalk_mark_read`
30
+ - `atalk_relay_supervision`
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
3
+ import { createAtalkMcpServer } from "./server.js";
4
+ const runtime = createAtalkMcpServer();
5
+ async function main() {
6
+ await runtime.start();
7
+ await runtime.server.connect(new StdioServerTransport());
8
+ console.error(`[aTalk] MCP connected as ${runtime.agent.peer?.handle ?? "unknown"}`);
9
+ }
10
+ async function shutdown() {
11
+ await runtime.stop();
12
+ process.exit(0);
13
+ }
14
+ process.once("SIGINT", () => void shutdown());
15
+ process.once("SIGTERM", () => void shutdown());
16
+ main().catch((error) => {
17
+ console.error(`[aTalk] MCP startup failed: ${error instanceof Error ? error.message : String(error)}`);
18
+ process.exit(1);
19
+ });
20
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;AAEvC,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,KAAK,CAAC,4BAA4B,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;AAC9C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;AAE/C,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { IncomingMessage } from "@atalk/sdk";
2
+ export interface SerializableMessage {
3
+ id: string;
4
+ conversationId: string;
5
+ text: string;
6
+ sender: IncomingMessage["sender"];
7
+ receivedAt: string;
8
+ isSupervisor: boolean;
9
+ }
10
+ export declare class AgentInbox {
11
+ private readonly capacity;
12
+ private readonly queued;
13
+ private readonly known;
14
+ private readonly waiters;
15
+ constructor(capacity?: number);
16
+ push(message: IncomingMessage): void;
17
+ get(id: string): IncomingMessage | undefined;
18
+ get pending(): number;
19
+ take(limit: number, waitSeconds: number): Promise<IncomingMessage[]>;
20
+ }
21
+ export declare function serializeMessage(message: IncomingMessage): SerializableMessage;
22
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,UAAU;IAKT,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAEpB,QAAQ,SAAM;IAE3C,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAapC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAEK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAgB3E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,mBAAmB,CAS9E"}
package/dist/inbox.js ADDED
@@ -0,0 +1,57 @@
1
+ export class AgentInbox {
2
+ capacity;
3
+ queued = [];
4
+ known = new Map();
5
+ waiters = new Set();
6
+ constructor(capacity = 500) {
7
+ this.capacity = capacity;
8
+ }
9
+ push(message) {
10
+ this.known.set(message.id, message);
11
+ this.queued.push(message);
12
+ while (this.queued.length > this.capacity)
13
+ this.queued.shift();
14
+ while (this.known.size > this.capacity * 2) {
15
+ const oldest = this.known.keys().next().value;
16
+ if (!oldest)
17
+ break;
18
+ this.known.delete(oldest);
19
+ }
20
+ for (const wake of this.waiters)
21
+ wake();
22
+ this.waiters.clear();
23
+ }
24
+ get(id) {
25
+ return this.known.get(id);
26
+ }
27
+ get pending() {
28
+ return this.queued.length;
29
+ }
30
+ async take(limit, waitSeconds) {
31
+ if (this.queued.length === 0 && waitSeconds > 0) {
32
+ await new Promise((resolve) => {
33
+ const timer = setTimeout(() => {
34
+ this.waiters.delete(wake);
35
+ resolve();
36
+ }, waitSeconds * 1_000);
37
+ const wake = () => {
38
+ clearTimeout(timer);
39
+ resolve();
40
+ };
41
+ this.waiters.add(wake);
42
+ });
43
+ }
44
+ return this.queued.splice(0, limit);
45
+ }
46
+ }
47
+ export function serializeMessage(message) {
48
+ return {
49
+ id: message.id,
50
+ conversationId: message.conversationId,
51
+ text: message.text,
52
+ sender: message.sender,
53
+ receivedAt: message.receivedAt.toISOString(),
54
+ isSupervisor: message.isSupervisor,
55
+ };
56
+ }
57
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,UAAU;IAKQ;IAJZ,MAAM,GAAsB,EAAE,CAAC;IAC/B,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC3C,OAAO,GAAG,IAAI,GAAG,EAAc,CAAC;IAEjD,YAA6B,WAAW,GAAG;QAAd,aAAQ,GAAR,QAAQ,CAAM;IAAG,CAAC;IAE/C,IAAI,CAAC,OAAwB;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAA2B,CAAC;YACpE,IAAI,CAAC,MAAM;gBAAE,MAAM;YACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,WAAmB;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC1B,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC;gBACxB,MAAM,IAAI,GAAG,GAAG,EAAE;oBAChB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAwB;IACvD,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createAtalkMcpServer } from "./server.js";
2
+ export type { AtalkMcpOptions, AtalkMcpRuntime } from "./server.js";
3
+ export { AgentInbox, serializeMessage } from "./inbox.js";
4
+ export type { SerializableMessage } from "./inbox.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createAtalkMcpServer } from "./server.js";
2
+ export { AgentInbox, serializeMessage } from "./inbox.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Agent } from "@atalk/sdk";
2
+ import { McpServer } from "@modelcontextprotocol/server";
3
+ import { AgentInbox } from "./inbox.js";
4
+ export interface AtalkMcpOptions {
5
+ token?: string;
6
+ baseUrl?: string;
7
+ credentialPath?: string;
8
+ agent?: Agent;
9
+ }
10
+ export interface AtalkMcpRuntime {
11
+ server: McpServer;
12
+ agent: Agent;
13
+ inbox: AgentInbox;
14
+ start(): Promise<void>;
15
+ stop(): Promise<void>;
16
+ }
17
+ export declare function createAtalkMcpServer(options?: AtalkMcpOptions): AtalkMcpRuntime;
18
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAwB,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAM1D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,eAAoB,GAAG,eAAe,CAwHnF"}
package/dist/server.js ADDED
@@ -0,0 +1,99 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ import { Agent } from "@atalk/sdk";
4
+ import { McpServer } from "@modelcontextprotocol/server";
5
+ import { z } from "zod";
6
+ import { AgentInbox, serializeMessage } from "./inbox.js";
7
+ const textResult = (value) => ({
8
+ content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
9
+ });
10
+ export function createAtalkMcpServer(options = {}) {
11
+ const token = options.token ?? process.env.ATALK_AGENT_TOKEN;
12
+ const agent = options.agent ?? new Agent({
13
+ ...(token ? { token } : {}),
14
+ baseUrl: options.baseUrl ?? process.env.ATALK_BASE_URL ?? "https://api.atalk.ar",
15
+ credentialPath: options.credentialPath
16
+ ?? process.env.ATALK_CREDENTIAL_PATH
17
+ ?? join(process.env.PLUGIN_DATA ?? join(homedir(), ".atalk"), "mcp-agent.json"),
18
+ });
19
+ const inbox = new AgentInbox();
20
+ const server = new McpServer({ name: "atalk", version: "0.1.0-alpha.4" });
21
+ agent.on("message", (message) => inbox.push(message));
22
+ agent.on("error", (error) => console.error(`[aTalk] ${error.message}`));
23
+ server.registerTool("atalk_status", { description: "Show the active aTalk identity, connection state, and queued message count." }, async () => textResult({ connected: agent.connected, peer: agent.peer ?? null, pendingMessages: inbox.pending }));
24
+ server.registerTool("atalk_receive", {
25
+ description: "Receive queued encrypted aTalk messages. Optionally wait briefly when the inbox is empty.",
26
+ inputSchema: z.object({
27
+ limit: z.number().int().min(1).max(50).default(10),
28
+ waitSeconds: z.number().int().min(0).max(25).default(0),
29
+ markRead: z.boolean().default(true),
30
+ }),
31
+ }, async ({ limit, waitSeconds, markRead }) => {
32
+ const messages = await inbox.take(limit, waitSeconds);
33
+ if (markRead)
34
+ await Promise.all(messages.map((message) => message.markRead()));
35
+ return textResult({ messages: messages.map(serializeMessage), pendingMessages: inbox.pending });
36
+ });
37
+ server.registerTool("atalk_send", {
38
+ description: "Start an encrypted aTalk conversation with a human or agent handle.",
39
+ inputSchema: z.object({
40
+ handle: z.string().min(2).max(100).describe("Recipient handle, for example @sales.company"),
41
+ text: z.string().min(1).max(32_000),
42
+ }),
43
+ }, async ({ handle, text }) => textResult(await agent.sendWithDetails(handle, text)));
44
+ server.registerTool("atalk_reply", {
45
+ description: "Reply to a previously received aTalk message, preserving its encrypted conversation.",
46
+ inputSchema: z.object({
47
+ messageId: z.string().uuid(),
48
+ text: z.string().min(1).max(32_000),
49
+ }),
50
+ }, async ({ messageId, text }) => {
51
+ const message = inbox.get(messageId);
52
+ if (!message)
53
+ throw new Error(`Unknown or expired aTalk message id: ${messageId}`);
54
+ return textResult({ messageId: await message.reply(text), conversationId: message.conversationId });
55
+ });
56
+ server.registerTool("atalk_send_in_conversation", {
57
+ description: "Send a message inside a known encrypted aTalk conversation.",
58
+ inputSchema: z.object({
59
+ handle: z.string().min(2).max(100),
60
+ conversationId: z.string().uuid(),
61
+ text: z.string().min(1).max(32_000),
62
+ }),
63
+ }, async ({ handle, conversationId, text }) => textResult({
64
+ messageId: await agent.sendInConversation(handle, text, conversationId),
65
+ conversationId,
66
+ }));
67
+ server.registerTool("atalk_mark_read", {
68
+ description: "Mark a previously received aTalk message as read.",
69
+ inputSchema: z.object({ messageId: z.string().uuid() }),
70
+ }, async ({ messageId }) => {
71
+ const message = inbox.get(messageId);
72
+ if (!message)
73
+ throw new Error(`Unknown or expired aTalk message id: ${messageId}`);
74
+ await message.markRead();
75
+ return textResult({ messageId, state: "READ" });
76
+ });
77
+ server.registerTool("atalk_relay_supervision", {
78
+ description: "Relay an owner's intervention received through an aTalk supervised conversation.",
79
+ inputSchema: z.object({
80
+ messageId: z.string().uuid(),
81
+ text: z.string().min(1).max(32_000),
82
+ }),
83
+ }, async ({ messageId, text }) => {
84
+ const message = inbox.get(messageId);
85
+ if (!message)
86
+ throw new Error(`Unknown or expired aTalk message id: ${messageId}`);
87
+ if (!message.isSupervisor)
88
+ throw new Error("The selected message is not a supervisor intervention");
89
+ return textResult({ messageId: await message.relay(text), conversationId: message.conversationId });
90
+ });
91
+ return {
92
+ server,
93
+ agent,
94
+ inbox,
95
+ start: () => agent.start(),
96
+ stop: () => agent.stop(),
97
+ };
98
+ }
99
+ //# 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/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@atalk/mcp-server",
3
+ "version": "0.1.0-alpha.4",
4
+ "description": "MCP server for secure human and AI-agent messaging over aTalk",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "atalk-mcp": "./dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ }
20
+ },
21
+ "scripts": {
22
+ "build": "pnpm clean && tsc -p tsconfig.json",
23
+ "clean": "node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"",
24
+ "prepack": "pnpm build",
25
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json",
26
+ "test": "vitest run"
27
+ },
28
+ "engines": {
29
+ "node": ">=20.17"
30
+ },
31
+ "license": "Apache-2.0",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/atalk-network/atalk-developers.git",
35
+ "directory": "integrations/mcp"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public",
39
+ "provenance": true,
40
+ "registry": "https://registry.npmjs.org/"
41
+ },
42
+ "dependencies": {
43
+ "@atalk/sdk": "workspace:*",
44
+ "@modelcontextprotocol/server": "^2.0.0",
45
+ "zod": "^4.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "@modelcontextprotocol/client": "^2.0.0",
49
+ "@types/node": "^24.0.0",
50
+ "typescript": "^5.9.0",
51
+ "vitest": "^4.0.0"
52
+ }
53
+ }