@slapy/mcp 1.0.0-alpha
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 +21 -0
- package/README.md +86 -0
- package/bin/slapy-mcp.js +8 -0
- package/dist/action-client.d.ts +41 -0
- package/dist/action-client.js +142 -0
- package/dist/action-client.js.map +1 -0
- package/dist/auth.d.ts +9 -0
- package/dist/auth.js +23 -0
- package/dist/auth.js.map +1 -0
- package/dist/contracts.d.ts +415 -0
- package/dist/contracts.js +157 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.js +26 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analytics.d.ts +2 -0
- package/dist/tools/analytics.js +12 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/atomize.d.ts +2 -0
- package/dist/tools/atomize.js +12 -0
- package/dist/tools/atomize.js.map +1 -0
- package/dist/tools/connector.d.ts +2 -0
- package/dist/tools/connector.js +12 -0
- package/dist/tools/connector.js.map +1 -0
- package/dist/tools/draft.d.ts +2 -0
- package/dist/tools/draft.js +22 -0
- package/dist/tools/draft.js.map +1 -0
- package/dist/tools/index.d.ts +18 -0
- package/dist/tools/index.js +84 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/json-schema.d.ts +3 -0
- package/dist/tools/json-schema.js +5 -0
- package/dist/tools/json-schema.js.map +1 -0
- package/dist/tools/review-queue.d.ts +2 -0
- package/dist/tools/review-queue.js +22 -0
- package/dist/tools/review-queue.js.map +1 -0
- package/dist/utils/format-response.d.ts +5 -0
- package/dist/utils/format-response.js +43 -0
- package/dist/utils/format-response.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AtomizeRunPayloadSchema } from "../contracts.js";
|
|
2
|
+
import { inputSchema } from "./json-schema.js";
|
|
3
|
+
export function atomizeTools() {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
name: "slapy_atomize_run",
|
|
7
|
+
description: "Request SLAPY atomization for a source into draft-ready formats. S1 alpha returns not_implemented until the backend atomizer worker is available.",
|
|
8
|
+
inputSchema: inputSchema(AtomizeRunPayloadSchema),
|
|
9
|
+
},
|
|
10
|
+
];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=atomize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomize.js","sourceRoot":"","sources":["../../src/tools/atomize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL;YACE,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,mJAAmJ;YAChK,WAAW,EAAE,WAAW,CAAC,uBAAuB,CAAC;SAClD;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ConnectorReadPayloadSchema } from "../contracts.js";
|
|
2
|
+
import { inputSchema } from "./json-schema.js";
|
|
3
|
+
export function connectorTools() {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
name: "slapy_connector_list",
|
|
7
|
+
description: "List connected social accounts available to the workspace.",
|
|
8
|
+
inputSchema: inputSchema(ConnectorReadPayloadSchema),
|
|
9
|
+
},
|
|
10
|
+
];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../src/tools/connector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL;YACE,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,4DAA4D;YACzE,WAAW,EAAE,WAAW,CAAC,0BAA0B,CAAC;SACrD;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DraftCreatePayloadSchema, DraftReadPayloadSchema, DraftUpdatePayloadSchema, } from "../contracts.js";
|
|
2
|
+
import { inputSchema } from "./json-schema.js";
|
|
3
|
+
export function draftTools() {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
name: "slapy_draft_list",
|
|
7
|
+
description: "List drafts in the current SLAPY workspace.",
|
|
8
|
+
inputSchema: inputSchema(DraftReadPayloadSchema),
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "slapy_draft_create",
|
|
12
|
+
description: "Create a draft in SLAPY without publishing it.",
|
|
13
|
+
inputSchema: inputSchema(DraftCreatePayloadSchema),
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "slapy_draft_update",
|
|
17
|
+
description: "Update an existing draft by ID.",
|
|
18
|
+
inputSchema: inputSchema(DraftUpdatePayloadSchema),
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=draft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.js","sourceRoot":"","sources":["../../src/tools/draft.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,UAAU,UAAU;IACxB,OAAO;QACL;YACE,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,6CAA6C;YAC1D,WAAW,EAAE,WAAW,CAAC,sBAAsB,CAAC;SACjD;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,gDAAgD;YAC7D,WAAW,EAAE,WAAW,CAAC,wBAAwB,CAAC;SACnD;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,iCAAiC;YAC9C,WAAW,EAAE,WAAW,CAAC,wBAAwB,CAAC;SACnD;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CallToolResult, Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { type McpAction, type ReviewQueueListInput } from "../contracts.js";
|
|
3
|
+
import type { SlapyMcpConfig } from "../auth.js";
|
|
4
|
+
import { formatMcpResponse } from "../utils/format-response.js";
|
|
5
|
+
export interface SlapyToolClient {
|
|
6
|
+
callAgentAction(input: {
|
|
7
|
+
action: McpAction;
|
|
8
|
+
target: string;
|
|
9
|
+
payload: unknown;
|
|
10
|
+
}): Promise<Parameters<typeof formatMcpResponse>[0]>;
|
|
11
|
+
listReviewQueue(input: ReviewQueueListInput): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface DispatchToolDeps {
|
|
14
|
+
config: SlapyMcpConfig;
|
|
15
|
+
client?: SlapyToolClient;
|
|
16
|
+
}
|
|
17
|
+
export declare function listSlapyTools(): Tool[];
|
|
18
|
+
export declare function dispatchToolCall(toolName: string, args: unknown, deps: DispatchToolDeps): Promise<CallToolResult>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { ACTION_PAYLOAD_SCHEMAS, ReviewQueueListInputSchema, TOOL_ACTION_MAP, } from "../contracts.js";
|
|
2
|
+
import { callAgentAction as defaultCallAgentAction, listReviewQueue as defaultListReviewQueue, } from "../action-client.js";
|
|
3
|
+
import { formatMcpResponse, formatPlainJsonResponse, formatToolError, } from "../utils/format-response.js";
|
|
4
|
+
import { analyticsTools } from "./analytics.js";
|
|
5
|
+
import { atomizeTools } from "./atomize.js";
|
|
6
|
+
import { connectorTools } from "./connector.js";
|
|
7
|
+
import { draftTools } from "./draft.js";
|
|
8
|
+
import { reviewQueueTools } from "./review-queue.js";
|
|
9
|
+
const TOOL_ORDER = [
|
|
10
|
+
...draftTools(),
|
|
11
|
+
...connectorTools(),
|
|
12
|
+
...atomizeTools(),
|
|
13
|
+
...reviewQueueTools(),
|
|
14
|
+
...analyticsTools(),
|
|
15
|
+
];
|
|
16
|
+
function defaultClient(config) {
|
|
17
|
+
return {
|
|
18
|
+
callAgentAction: ({ action, target, payload }) => defaultCallAgentAction({ action, target, payload, config }),
|
|
19
|
+
listReviewQueue: (input) => defaultListReviewQueue({ input, config }),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function isActionToolName(name) {
|
|
23
|
+
return Object.prototype.hasOwnProperty.call(TOOL_ACTION_MAP, name);
|
|
24
|
+
}
|
|
25
|
+
function targetForAction(action, payload) {
|
|
26
|
+
if ((action === "draft.update" || action === "review_queue.approve" || action === "review_queue.reject") &&
|
|
27
|
+
payload &&
|
|
28
|
+
typeof payload === "object") {
|
|
29
|
+
const id = "draft_id" in payload
|
|
30
|
+
? payload.draft_id
|
|
31
|
+
: payload.pending_action_id;
|
|
32
|
+
if (typeof id === "string" && id.trim()) {
|
|
33
|
+
return id;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (action.startsWith("draft."))
|
|
37
|
+
return "drafts";
|
|
38
|
+
if (action.startsWith("connector."))
|
|
39
|
+
return "connectors";
|
|
40
|
+
if (action.startsWith("review_queue."))
|
|
41
|
+
return "review_queue";
|
|
42
|
+
if (action.startsWith("analytics."))
|
|
43
|
+
return "analytics";
|
|
44
|
+
return "atomize";
|
|
45
|
+
}
|
|
46
|
+
function validationError(message) {
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: "text", text: message }],
|
|
49
|
+
isError: true,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function listSlapyTools() {
|
|
53
|
+
return [...TOOL_ORDER];
|
|
54
|
+
}
|
|
55
|
+
export async function dispatchToolCall(toolName, args, deps) {
|
|
56
|
+
try {
|
|
57
|
+
const client = deps.client ?? defaultClient(deps.config);
|
|
58
|
+
if (toolName === "slapy_review_queue_list") {
|
|
59
|
+
const parsed = ReviewQueueListInputSchema.safeParse(args ?? {});
|
|
60
|
+
if (!parsed.success) {
|
|
61
|
+
return validationError(parsed.error.message);
|
|
62
|
+
}
|
|
63
|
+
return formatPlainJsonResponse(await client.listReviewQueue(parsed.data));
|
|
64
|
+
}
|
|
65
|
+
if (!isActionToolName(toolName)) {
|
|
66
|
+
return validationError(`Unknown tool: ${toolName}`);
|
|
67
|
+
}
|
|
68
|
+
const action = TOOL_ACTION_MAP[toolName];
|
|
69
|
+
const parsed = ACTION_PAYLOAD_SCHEMAS[action].safeParse(args ?? {});
|
|
70
|
+
if (!parsed.success) {
|
|
71
|
+
return validationError(parsed.error.message);
|
|
72
|
+
}
|
|
73
|
+
const response = await client.callAgentAction({
|
|
74
|
+
action,
|
|
75
|
+
target: targetForAction(action, parsed.data),
|
|
76
|
+
payload: parsed.data,
|
|
77
|
+
});
|
|
78
|
+
return formatMcpResponse(response, action);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
return formatToolError(error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../../src/tools/json-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAwB,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ReviewQueueApprovePayloadSchema, ReviewQueueListInputSchema, ReviewQueueRejectPayloadSchema, } from "../contracts.js";
|
|
2
|
+
import { inputSchema } from "./json-schema.js";
|
|
3
|
+
export function reviewQueueTools() {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
name: "slapy_review_queue_list",
|
|
7
|
+
description: "List review queue items for human approval handoffs.",
|
|
8
|
+
inputSchema: inputSchema(ReviewQueueListInputSchema),
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "slapy_review_queue_approve",
|
|
12
|
+
description: "Approve a pending SLAPY review queue action.",
|
|
13
|
+
inputSchema: inputSchema(ReviewQueueApprovePayloadSchema),
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "slapy_review_queue_reject",
|
|
17
|
+
description: "Reject a pending SLAPY review queue action.",
|
|
18
|
+
inputSchema: inputSchema(ReviewQueueRejectPayloadSchema),
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=review-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-queue.js","sourceRoot":"","sources":["../../src/tools/review-queue.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL;YACE,IAAI,EAAE,yBAAyB;YAC/B,WAAW,EAAE,sDAAsD;YACnE,WAAW,EAAE,WAAW,CAAC,0BAA0B,CAAC;SACrD;QACD;YACE,IAAI,EAAE,4BAA4B;YAClC,WAAW,EAAE,8CAA8C;YAC3D,WAAW,EAAE,WAAW,CAAC,+BAA+B,CAAC;SAC1D;QACD;YACE,IAAI,EAAE,2BAA2B;YACjC,WAAW,EAAE,6CAA6C;YAC1D,WAAW,EAAE,WAAW,CAAC,8BAA8B,CAAC;SACzD;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type { McpAction, SlimeActionDaemonResponse } from "../contracts.js";
|
|
3
|
+
export declare function formatPlainJsonResponse(value: unknown): CallToolResult;
|
|
4
|
+
export declare function formatMcpResponse(response: SlimeActionDaemonResponse, action: McpAction | string): CallToolResult;
|
|
5
|
+
export declare function formatToolError(error: unknown): CallToolResult;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
function text(content, isError) {
|
|
2
|
+
return {
|
|
3
|
+
content: [{ type: "text", text: content }],
|
|
4
|
+
...(isError ? { isError: true } : {}),
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
export function formatPlainJsonResponse(value) {
|
|
8
|
+
return text(JSON.stringify(value, null, 2));
|
|
9
|
+
}
|
|
10
|
+
function authorizedPayload(response) {
|
|
11
|
+
return {
|
|
12
|
+
status: response.status,
|
|
13
|
+
audit_ref: response.audit_ref,
|
|
14
|
+
request_hash: response.request_hash,
|
|
15
|
+
...(response.result ? { result: response.result } : {}),
|
|
16
|
+
...(response.rewrite ? { rewrite: response.rewrite } : {}),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function formatMcpResponse(response, action) {
|
|
20
|
+
if (response.status === "AUTHORIZED" || response.status === "REWRITTEN") {
|
|
21
|
+
return formatPlainJsonResponse(authorizedPayload(response));
|
|
22
|
+
}
|
|
23
|
+
if (response.status === "REQUIRES_APPROVAL") {
|
|
24
|
+
const approval = response.approval_required;
|
|
25
|
+
return text([
|
|
26
|
+
"Action queued for human approval.",
|
|
27
|
+
`Action: ${action}`,
|
|
28
|
+
`Pending action ID: ${approval?.pending_action_id ?? "(missing)"}`,
|
|
29
|
+
`Expires at: ${approval?.expires_at ?? "(unknown)"}`,
|
|
30
|
+
`Approval URL: ${approval?.approval_url ?? "(open SLAPY /review-queue)"}`,
|
|
31
|
+
"The calling agent can ask the user to approve it or poll slapy_review_queue_list.",
|
|
32
|
+
].join("\n"));
|
|
33
|
+
}
|
|
34
|
+
const retry = response.rate_limit
|
|
35
|
+
? ` Retry after ${response.rate_limit.retry_after}s.`
|
|
36
|
+
: "";
|
|
37
|
+
return text(`Action failed: ${response.status}. Reason: ${response.reason_code}.${retry}`, true);
|
|
38
|
+
}
|
|
39
|
+
export function formatToolError(error) {
|
|
40
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
41
|
+
return text(message, true);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=format-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-response.js","sourceRoot":"","sources":["../../src/utils/format-response.ts"],"names":[],"mappings":"AAIA,SAAS,IAAI,CAAC,OAAe,EAAE,OAAiB;IAC9C,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAmC;IAC5D,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAmC,EACnC,MAA0B;IAE1B,IAAI,QAAQ,CAAC,MAAM,KAAK,YAAY,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACxE,OAAO,uBAAuB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAAC;QAC5C,OAAO,IAAI,CACT;YACE,mCAAmC;YACnC,WAAW,MAAM,EAAE;YACnB,sBAAsB,QAAQ,EAAE,iBAAiB,IAAI,WAAW,EAAE;YAClE,eAAe,QAAQ,EAAE,UAAU,IAAI,WAAW,EAAE;YACpD,iBAAiB,QAAQ,EAAE,YAAY,IAAI,4BAA4B,EAAE;YACzE,mFAAmF;SACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU;QAC/B,CAAC,CAAC,gBAAgB,QAAQ,CAAC,UAAU,CAAC,WAAW,IAAI;QACrD,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,IAAI,CACT,kBAAkB,QAAQ,CAAC,MAAM,aAAa,QAAQ,CAAC,WAAW,IAAI,KAAK,EAAE,EAC7E,IAAI,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@slapy/mcp",
|
|
3
|
+
"version": "1.0.0-alpha",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Model Context Protocol server for SLAPY agent-native social publishing.",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "Technologies CoreXalt Inc.",
|
|
10
|
+
"email": "syfcorp@proton.me"
|
|
11
|
+
},
|
|
12
|
+
"bin": {
|
|
13
|
+
"slapy-mcp": "./bin/slapy-mcp.js"
|
|
14
|
+
},
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"bin",
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc -p tsconfig.json",
|
|
28
|
+
"test": "vitest run",
|
|
29
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
33
|
+
"zod": "^4.3.6",
|
|
34
|
+
"zod-to-json-schema": "^3.25.2"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {}
|
|
37
|
+
}
|