pqc-memory-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/.env.example +47 -0
- package/AGENTS.md +13 -0
- package/README.md +403 -0
- package/dist/auth/tenant-verifier.d.ts +18 -0
- package/dist/auth/tenant-verifier.d.ts.map +1 -0
- package/dist/auth/tenant-verifier.js +255 -0
- package/dist/auth/tenant-verifier.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +244 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +543 -0
- package/dist/client.js.map +1 -0
- package/dist/debug.d.ts +6 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +21 -0
- package/dist/debug.js.map +1 -0
- package/dist/http.d.ts +21 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +189 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/init-wizard.d.ts +3 -0
- package/dist/init-wizard.d.ts.map +1 -0
- package/dist/init-wizard.js +138 -0
- package/dist/init-wizard.js.map +1 -0
- package/dist/mcp-exchange.d.ts +38 -0
- package/dist/mcp-exchange.d.ts.map +1 -0
- package/dist/mcp-exchange.js +126 -0
- package/dist/mcp-exchange.js.map +1 -0
- package/dist/server-factory.d.ts +8 -0
- package/dist/server-factory.d.ts.map +1 -0
- package/dist/server-factory.js +29 -0
- package/dist/server-factory.js.map +1 -0
- package/dist/session.d.ts +27 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +121 -0
- package/dist/session.js.map +1 -0
- package/dist/tenant-cache.d.ts +20 -0
- package/dist/tenant-cache.d.ts.map +1 -0
- package/dist/tenant-cache.js +61 -0
- package/dist/tenant-cache.js.map +1 -0
- package/dist/tenant-fetch.d.ts +20 -0
- package/dist/tenant-fetch.d.ts.map +1 -0
- package/dist/tenant-fetch.js +91 -0
- package/dist/tenant-fetch.js.map +1 -0
- package/dist/tenant-runtime.d.ts +16 -0
- package/dist/tenant-runtime.d.ts.map +1 -0
- package/dist/tenant-runtime.js +31 -0
- package/dist/tenant-runtime.js.map +1 -0
- package/dist/tenant.d.ts +20 -0
- package/dist/tenant.d.ts.map +1 -0
- package/dist/tenant.js +26 -0
- package/dist/tenant.js.map +1 -0
- package/dist/tool-definitions.d.ts +9 -0
- package/dist/tool-definitions.d.ts.map +1 -0
- package/dist/tool-definitions.js +81 -0
- package/dist/tool-definitions.js.map +1 -0
- package/dist/tool-dispatch.d.ts +9 -0
- package/dist/tool-dispatch.d.ts.map +1 -0
- package/dist/tool-dispatch.js +194 -0
- package/dist/tool-dispatch.js.map +1 -0
- package/dist/tools/codegraph.d.ts +73 -0
- package/dist/tools/codegraph.d.ts.map +1 -0
- package/dist/tools/codegraph.js +203 -0
- package/dist/tools/codegraph.js.map +1 -0
- package/dist/tools/delete.d.ts +18 -0
- package/dist/tools/delete.d.ts.map +1 -0
- package/dist/tools/delete.js +23 -0
- package/dist/tools/delete.js.map +1 -0
- package/dist/tools/evolution.d.ts +90 -0
- package/dist/tools/evolution.d.ts.map +1 -0
- package/dist/tools/evolution.js +255 -0
- package/dist/tools/evolution.js.map +1 -0
- package/dist/tools/graph.d.ts +43 -0
- package/dist/tools/graph.d.ts.map +1 -0
- package/dist/tools/graph.js +94 -0
- package/dist/tools/graph.js.map +1 -0
- package/dist/tools/models.d.ts +57 -0
- package/dist/tools/models.d.ts.map +1 -0
- package/dist/tools/models.js +105 -0
- package/dist/tools/models.js.map +1 -0
- package/dist/tools/narratives.d.ts +82 -0
- package/dist/tools/narratives.d.ts.map +1 -0
- package/dist/tools/narratives.js +218 -0
- package/dist/tools/narratives.js.map +1 -0
- package/dist/tools/objects.d.ts +65 -0
- package/dist/tools/objects.d.ts.map +1 -0
- package/dist/tools/objects.js +157 -0
- package/dist/tools/objects.js.map +1 -0
- package/dist/tools/obsidian.d.ts +31 -0
- package/dist/tools/obsidian.d.ts.map +1 -0
- package/dist/tools/obsidian.js +167 -0
- package/dist/tools/obsidian.js.map +1 -0
- package/dist/tools/outcome.d.ts +21 -0
- package/dist/tools/outcome.d.ts.map +1 -0
- package/dist/tools/outcome.js +35 -0
- package/dist/tools/outcome.js.map +1 -0
- package/dist/tools/promote.d.ts +21 -0
- package/dist/tools/promote.d.ts.map +1 -0
- package/dist/tools/promote.js +31 -0
- package/dist/tools/promote.js.map +1 -0
- package/dist/tools/reflect.d.ts +27 -0
- package/dist/tools/reflect.d.ts.map +1 -0
- package/dist/tools/reflect.js +85 -0
- package/dist/tools/reflect.js.map +1 -0
- package/dist/tools/search.d.ts +27 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +42 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/strategies.d.ts +43 -0
- package/dist/tools/strategies.d.ts.map +1 -0
- package/dist/tools/strategies.js +126 -0
- package/dist/tools/strategies.js.map +1 -0
- package/dist/tools/summary.d.ts +61 -0
- package/dist/tools/summary.d.ts.map +1 -0
- package/dist/tools/summary.js +124 -0
- package/dist/tools/summary.js.map +1 -0
- package/dist/tools/swarm.d.ts +71 -0
- package/dist/tools/swarm.d.ts.map +1 -0
- package/dist/tools/swarm.js +145 -0
- package/dist/tools/swarm.js.map +1 -0
- package/dist/tools/v4.d.ts +152 -0
- package/dist/tools/v4.d.ts.map +1 -0
- package/dist/tools/v4.js +348 -0
- package/dist/tools/v4.js.map +1 -0
- package/dist/tools/write.d.ts +30 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +52 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +359 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/zod-json-schema.d.ts +3 -0
- package/dist/zod-json-schema.d.ts.map +1 -0
- package/dist/zod-json-schema.js +52 -0
- package/dist/zod-json-schema.js.map +1 -0
- package/docs/claude-remote-oauth.md +26 -0
- package/docs/crypticpqc-auth-architecture.md +107 -0
- package/docs/crypticpqc-cross-domain-auth.md +194 -0
- package/docs/mcp-auth0-exchange-contract.md +75 -0
- package/docs/mcp-authorization-spec-alignment.md +29 -0
- package/docs/mcp-org-object-storage.md +55 -0
- package/docs/pqc-api-tenant-context-go.md +238 -0
- package/docs/pqc-db-mcp-tenant-context.md +15 -0
- package/docs/pqc-db-tenant-context-implementation.md +32 -0
- package/docs/standalone-distribution.md +92 -0
- package/package.json +52 -0
- package/scripts/start.mjs +13 -0
package/dist/http.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Streamable HTTP MCP entrypoint for remote clients (e.g. Claude.ai connectors).
|
|
4
|
+
*
|
|
5
|
+
* Requires:
|
|
6
|
+
* PQC_TENANT_RESOLUTION_URL — pqc-api **public origin only** (e.g. https://crypticpqc.com); MCP calls
|
|
7
|
+
* GET {origin}/api/v1/mcp/tenant-context. Bearer = pqc-api access JWT (HS256).
|
|
8
|
+
*
|
|
9
|
+
* Optional:
|
|
10
|
+
* PORT — preferred on PaaS (Zeabur, Railway, Render); falls back to PQC_MCP_HTTP_PORT then 8787
|
|
11
|
+
* PQC_MCP_SERVICE_API_KEY — forwarded as X-API-Key to tenant-context and mcp-exchange if set
|
|
12
|
+
* PQC_MCP_AUTH0_EXCHANGE — off | 1/retry/true | always (see docs/mcp-auth0-exchange-contract.md)
|
|
13
|
+
* PQC_MCP_ALLOWED_HOSTS — comma-separated host allowlist for DNS rebinding protection
|
|
14
|
+
* PQC_MCP_PUBLIC_URL — public origin for OAuth protected resource metadata (e.g. https://mcp.example.com)
|
|
15
|
+
* PQC_MCP_AUTHORIZATION_SERVERS — comma-separated issuer URLs for PRM (external IdP)
|
|
16
|
+
* PQC_MCP_PRM_RESOURCE — optional RFC 9728 `resource` URL override (default: {PUBLIC_URL}/mcp). Must match Auth0 API Identifier if the client maps resource → audience.
|
|
17
|
+
* PQC_TENANT_CONTEXT_MOCK=1 — dev only; uses PQC_API_* env as tenant for any bearer
|
|
18
|
+
* PQC_MCP_DEBUG=1 — log HTTP + auth resolution steps (no secrets; token fingerprints only)
|
|
19
|
+
*/
|
|
20
|
+
import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
|
|
21
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
22
|
+
import { requireBearerAuth } from "@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js";
|
|
23
|
+
import { createPqcTenantVerifier } from "./auth/tenant-verifier.js";
|
|
24
|
+
import { TenantRuntimeCache } from "./tenant-cache.js";
|
|
25
|
+
import { createPqcMcpServer } from "./server-factory.js";
|
|
26
|
+
import { isMcpDebug, mcpDebug } from "./debug.js";
|
|
27
|
+
const resolutionUrl = process.env.PQC_TENANT_RESOLUTION_URL;
|
|
28
|
+
const port = parseInt(process.env.PORT ?? process.env.PQC_MCP_HTTP_PORT ?? "8787", 10);
|
|
29
|
+
const publicUrl = process.env.PQC_MCP_PUBLIC_URL?.replace(/\/$/, "");
|
|
30
|
+
const authServersEnv = process.env.PQC_MCP_AUTHORIZATION_SERVERS;
|
|
31
|
+
function parseAllowedHosts() {
|
|
32
|
+
const raw = process.env.PQC_MCP_ALLOWED_HOSTS;
|
|
33
|
+
if (!raw?.trim())
|
|
34
|
+
return undefined;
|
|
35
|
+
return raw
|
|
36
|
+
.split(",")
|
|
37
|
+
.map((s) => s.trim())
|
|
38
|
+
.filter(Boolean);
|
|
39
|
+
}
|
|
40
|
+
async function main() {
|
|
41
|
+
if (!resolutionUrl) {
|
|
42
|
+
console.error("PQC_TENANT_RESOLUTION_URL is required for HTTP MCP");
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
const cache = new TenantRuntimeCache();
|
|
46
|
+
const verifier = createPqcTenantVerifier(resolutionUrl);
|
|
47
|
+
const bearerAuth = requireBearerAuth({
|
|
48
|
+
verifier,
|
|
49
|
+
requiredScopes: [],
|
|
50
|
+
});
|
|
51
|
+
const app = createMcpExpressApp({
|
|
52
|
+
host: "0.0.0.0",
|
|
53
|
+
allowedHosts: parseAllowedHosts(),
|
|
54
|
+
});
|
|
55
|
+
if (isMcpDebug()) {
|
|
56
|
+
app.use((req, _res, next) => {
|
|
57
|
+
const pathOnly = (req.originalUrl || req.url || "").split("?")[0];
|
|
58
|
+
mcpDebug("http.request", {
|
|
59
|
+
method: req.method,
|
|
60
|
+
path: pathOnly,
|
|
61
|
+
host: req.headers.host ?? "",
|
|
62
|
+
hasAuthorization: Boolean(req.headers.authorization),
|
|
63
|
+
});
|
|
64
|
+
next();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const healthPayload = {
|
|
68
|
+
status: "ok",
|
|
69
|
+
service: "pqc-memory-mcp",
|
|
70
|
+
transport: "streamable-http",
|
|
71
|
+
mcp_post_path: "/mcp",
|
|
72
|
+
tenant_resolution: "configured",
|
|
73
|
+
};
|
|
74
|
+
app.get("/", (_req, res) => {
|
|
75
|
+
res.json({
|
|
76
|
+
...healthPayload,
|
|
77
|
+
message: "MCP clients must use POST /mcp with Authorization: Bearer. This root URL is for humans and load balancers.",
|
|
78
|
+
links: { health: "/health", healthz: "/healthz", mcp: "POST /mcp" },
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
app.get("/health", (_req, res) => {
|
|
82
|
+
res.set("Cache-Control", "no-store");
|
|
83
|
+
res.json(healthPayload);
|
|
84
|
+
});
|
|
85
|
+
app.get("/healthz", (_req, res) => {
|
|
86
|
+
res.set("Cache-Control", "no-store");
|
|
87
|
+
res.json(healthPayload);
|
|
88
|
+
});
|
|
89
|
+
if (publicUrl && authServersEnv) {
|
|
90
|
+
const authorization_servers = authServersEnv
|
|
91
|
+
.split(",")
|
|
92
|
+
.map((s) => s.trim())
|
|
93
|
+
.filter(Boolean);
|
|
94
|
+
const resourceOverride = process.env.PQC_MCP_PRM_RESOURCE?.trim().replace(/\/$/, "");
|
|
95
|
+
const resource = resourceOverride || `${publicUrl}/mcp`;
|
|
96
|
+
app.get("/.well-known/oauth-protected-resource/mcp", (_req, res) => {
|
|
97
|
+
mcpDebug("oauth.prm.serve", {
|
|
98
|
+
resource,
|
|
99
|
+
authorization_servers_count: authorization_servers.length,
|
|
100
|
+
});
|
|
101
|
+
res.json({
|
|
102
|
+
resource,
|
|
103
|
+
authorization_servers,
|
|
104
|
+
scopes_supported: ["mcp:memory", "openid"],
|
|
105
|
+
bearer_methods_supported: ["header"],
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
app.post("/mcp", (req, _res, next) => {
|
|
110
|
+
mcpDebug("mcp.post.received", {
|
|
111
|
+
hasAuthorization: Boolean(req.headers.authorization),
|
|
112
|
+
contentType: String(req.headers["content-type"] ?? ""),
|
|
113
|
+
});
|
|
114
|
+
next();
|
|
115
|
+
}, bearerAuth, async (req, res) => {
|
|
116
|
+
mcpDebug("mcp.post.authenticated", {
|
|
117
|
+
contentType: String(req.headers["content-type"] ?? ""),
|
|
118
|
+
contentLength: String(req.headers["content-length"] ?? ""),
|
|
119
|
+
});
|
|
120
|
+
const server = createPqcMcpServer(async (extra) => {
|
|
121
|
+
const auth = (extra?.authInfo ?? req.auth);
|
|
122
|
+
if (!auth?.rawToken || !auth.tenantContext) {
|
|
123
|
+
throw new Error("Missing tenant context for tool execution");
|
|
124
|
+
}
|
|
125
|
+
return cache.getOrCreate(auth.rawToken, auth.tenantContext);
|
|
126
|
+
});
|
|
127
|
+
const transport = new StreamableHTTPServerTransport({
|
|
128
|
+
sessionIdGenerator: undefined,
|
|
129
|
+
});
|
|
130
|
+
try {
|
|
131
|
+
await server.connect(transport);
|
|
132
|
+
res.on("close", () => {
|
|
133
|
+
void transport.close();
|
|
134
|
+
void server.close();
|
|
135
|
+
});
|
|
136
|
+
mcpDebug("mcp.post.streamable.handle_request");
|
|
137
|
+
await transport.handleRequest(req, res, req.body);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
mcpDebug("mcp.post.error", {
|
|
141
|
+
name: error instanceof Error ? error.name : "unknown",
|
|
142
|
+
message: error instanceof Error ? error.message.slice(0, 200) : String(error).slice(0, 200),
|
|
143
|
+
});
|
|
144
|
+
console.error("[pqc-memory] MCP HTTP error:", error);
|
|
145
|
+
if (!res.headersSent) {
|
|
146
|
+
res.status(500).json({
|
|
147
|
+
jsonrpc: "2.0",
|
|
148
|
+
error: { code: -32603, message: "Internal server error" },
|
|
149
|
+
id: null,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
// Browsers open /mcp with GET — return 200 so the deployment doesn’t look "broken".
|
|
155
|
+
// Real MCP traffic uses POST /mcp (see stateless Streamable HTTP examples).
|
|
156
|
+
app.get("/mcp", (_req, res) => {
|
|
157
|
+
res.set("Cache-Control", "no-store");
|
|
158
|
+
res.json({
|
|
159
|
+
service: "pqc-memory-mcp",
|
|
160
|
+
ok: true,
|
|
161
|
+
message: "Use POST /mcp with an MCP client (e.g. Claude connector). GET is only a sanity check.",
|
|
162
|
+
health: "/health",
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
app.delete("/mcp", (_req, res) => {
|
|
166
|
+
res.status(405).json({
|
|
167
|
+
jsonrpc: "2.0",
|
|
168
|
+
error: { code: -32000, message: "Method not allowed for DELETE" },
|
|
169
|
+
id: null,
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
app.listen(port, () => {
|
|
173
|
+
console.error(`[pqc-memory] Streamable HTTP MCP on port ${port} (POST /mcp)`);
|
|
174
|
+
if (isMcpDebug()) {
|
|
175
|
+
mcpDebug("http.boot", {
|
|
176
|
+
port,
|
|
177
|
+
tenantResolutionOrigin: resolutionUrl,
|
|
178
|
+
prmMounted: Boolean(publicUrl && authServersEnv),
|
|
179
|
+
auth0Exchange: (process.env.PQC_MCP_AUTH0_EXCHANGE || "off").trim() || "off",
|
|
180
|
+
hasServiceApiKey: Boolean(process.env.PQC_MCP_SERVICE_API_KEY),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
main().catch((e) => {
|
|
186
|
+
console.error(e);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { loadTenantFromEnv } from "./tenant.js";
|
|
4
|
+
import { TenantRuntime } from "./tenant-runtime.js";
|
|
5
|
+
import { createPqcMcpServer } from "./server-factory.js";
|
|
6
|
+
async function main() {
|
|
7
|
+
const tenant = loadTenantFromEnv();
|
|
8
|
+
const runtime = TenantRuntime.fromContext(tenant);
|
|
9
|
+
const server = createPqcMcpServer(async () => runtime);
|
|
10
|
+
process.on("SIGINT", async () => {
|
|
11
|
+
console.error("[pqc-memory] Shutting down...");
|
|
12
|
+
await runtime.sessionManager.close();
|
|
13
|
+
process.exit(0);
|
|
14
|
+
});
|
|
15
|
+
process.on("SIGTERM", async () => {
|
|
16
|
+
console.error("[pqc-memory] Shutting down...");
|
|
17
|
+
await runtime.sessionManager.close();
|
|
18
|
+
process.exit(0);
|
|
19
|
+
});
|
|
20
|
+
const transport = new StdioServerTransport();
|
|
21
|
+
await server.connect(transport);
|
|
22
|
+
console.error("[pqc-memory] Server started (stdio)");
|
|
23
|
+
}
|
|
24
|
+
main().catch((error) => {
|
|
25
|
+
console.error("[pqc-memory] Fatal error:", error);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;IAEvD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-wizard.d.ts","sourceRoot":"","sources":["../src/init-wizard.ts"],"names":[],"mappings":";AAyDA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgHnD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Interactive MCP config merge: Cursor, Claude Code, or JetBrains Junie.
|
|
4
|
+
* All use the same server entry shape: { command, args, env } under mcpServers.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs";
|
|
7
|
+
import * as os from "node:os";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import * as readline from "node:readline/promises";
|
|
10
|
+
function die(msg, rl) {
|
|
11
|
+
rl.close();
|
|
12
|
+
console.error(msg);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
function configPathFor(host, scope) {
|
|
16
|
+
switch (host) {
|
|
17
|
+
case "cursor":
|
|
18
|
+
return scope === "global"
|
|
19
|
+
? path.join(os.homedir(), ".cursor", "mcp.json")
|
|
20
|
+
: path.join(process.cwd(), ".cursor", "mcp.json");
|
|
21
|
+
case "claude":
|
|
22
|
+
return scope === "global"
|
|
23
|
+
? path.join(os.homedir(), ".claude.json")
|
|
24
|
+
: path.join(process.cwd(), ".mcp.json");
|
|
25
|
+
case "junie":
|
|
26
|
+
return scope === "global"
|
|
27
|
+
? path.join(os.homedir(), ".junie", "mcp", "mcp.json")
|
|
28
|
+
: path.join(process.cwd(), ".junie", "mcp", "mcp.json");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function hostLabel(host) {
|
|
32
|
+
switch (host) {
|
|
33
|
+
case "cursor":
|
|
34
|
+
return "Cursor";
|
|
35
|
+
case "claude":
|
|
36
|
+
return "Claude Code";
|
|
37
|
+
case "junie":
|
|
38
|
+
return "JetBrains Junie";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function nextSteps(host, configPath, serverName) {
|
|
42
|
+
const base = `\nDone.\n\n Wrote: ${configPath}\n\nNext steps:\n`;
|
|
43
|
+
if (host === "cursor") {
|
|
44
|
+
return `${base} • Fully quit and reopen Cursor (or Command Palette → “Reload Window”).\n • Settings → Tools & MCP → confirm “${serverName}” appears.\n\nHelp: https://github.com/CascadiaTech/pqc-mcp-server\n`;
|
|
45
|
+
}
|
|
46
|
+
if (host === "claude") {
|
|
47
|
+
return `${base} • Restart Claude Code (or reload MCP).\n • Run /mcp to verify “${serverName}” is listed.\n • Project scope uses .mcp.json — approve project prompts if asked.\n\nDocs: https://code.claude.com/docs/en/mcp\n`;
|
|
48
|
+
}
|
|
49
|
+
return `${base} • Restart the IDE or Junie CLI.\n • Use the /mcp command to confirm “${serverName}” (Junie CLI) or MCP Settings in the IDE.\n • Project file: .junie/mcp/mcp.json; user file: ~/.junie/mcp/mcp.json\n\nDocs: https://junie.jetbrains.com/docs/junie-cli-mcp-configuration.html\n`;
|
|
50
|
+
}
|
|
51
|
+
export async function runInitWizard() {
|
|
52
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
53
|
+
console.log(`
|
|
54
|
+
╔══════════════════════════════════════════════════════════════╗
|
|
55
|
+
║ pqc-memory-mcp — MCP setup (Cursor, Claude Code, or Junie) ║
|
|
56
|
+
╠══════════════════════════════════════════════════════════════╣
|
|
57
|
+
║ Writes or merges mcpServers in the config file your client ║
|
|
58
|
+
║ reads. Secrets are stored in that file — do not commit ║
|
|
59
|
+
║ project files that contain API keys. ║
|
|
60
|
+
╚══════════════════════════════════════════════════════════════╝
|
|
61
|
+
`);
|
|
62
|
+
const hostAns = await rl.question("Which client? [1] Cursor [2] Claude Code [3] JetBrains Junie (default: 1): ");
|
|
63
|
+
const h = hostAns.trim();
|
|
64
|
+
const host = h === "2" ? "claude" : h === "3" ? "junie" : "cursor";
|
|
65
|
+
const scopeAns = await rl.question(`Save where? [1] This project only [2] Your user account (all projects) (default: 1)\n` +
|
|
66
|
+
` (${hostLabel(host)}: ${host === "cursor"
|
|
67
|
+
? ".cursor/mcp.json vs ~/.cursor/mcp.json"
|
|
68
|
+
: host === "claude"
|
|
69
|
+
? ".mcp.json vs ~/.claude.json"
|
|
70
|
+
: ".junie/mcp/mcp.json vs ~/.junie/mcp/mcp.json"}): `);
|
|
71
|
+
const scope = scopeAns.trim() === "2" ? "global" : "project";
|
|
72
|
+
const configPath = configPathFor(host, scope);
|
|
73
|
+
const defaultUrl = (process.env.PQC_API_URL || "https://crypticpqc.com").replace(/\/$/, "");
|
|
74
|
+
const urlIn = await rl.question(`pqc-db API URL (no trailing slash) [${defaultUrl}]: `);
|
|
75
|
+
const apiUrl = (urlIn.trim() || defaultUrl).replace(/\/$/, "");
|
|
76
|
+
const keyIn = await rl.question("API key (the pqc_… key — visible as you type; paste and press Enter): ");
|
|
77
|
+
const apiKey = keyIn.trim();
|
|
78
|
+
if (!apiKey)
|
|
79
|
+
die("API key is required.", rl);
|
|
80
|
+
const bucketIn = await rl.question("Memory bucket ID (UUID): ");
|
|
81
|
+
const bucketId = bucketIn.trim();
|
|
82
|
+
if (!bucketId)
|
|
83
|
+
die("Bucket ID is required.", rl);
|
|
84
|
+
const nameIn = await rl.question(`MCP server name [pqc-memory]: `);
|
|
85
|
+
const serverName = nameIn.trim() || "pqc-memory";
|
|
86
|
+
const methodAns = await rl.question("Start server how? [1] npx -y pqc-memory-mcp (npm — default) [2] node + absolute path to cli.js (local / .tgz): ");
|
|
87
|
+
const useLocal = methodAns.trim() === "2";
|
|
88
|
+
const env = {
|
|
89
|
+
PQC_API_URL: apiUrl,
|
|
90
|
+
PQC_API_KEY: apiKey,
|
|
91
|
+
PQC_BUCKET_ID: bucketId,
|
|
92
|
+
};
|
|
93
|
+
let command;
|
|
94
|
+
let args;
|
|
95
|
+
if (useLocal) {
|
|
96
|
+
const pIn = await rl.question("Absolute path to dist/cli.js (e.g. …/node_modules/pqc-memory-mcp/dist/cli.js): ");
|
|
97
|
+
const cliPath = pIn.trim();
|
|
98
|
+
if (!cliPath)
|
|
99
|
+
die("Path is required for local mode.", rl);
|
|
100
|
+
const resolved = path.resolve(cliPath);
|
|
101
|
+
if (!fs.existsSync(resolved))
|
|
102
|
+
die(`File not found: ${resolved}`, rl);
|
|
103
|
+
command = "node";
|
|
104
|
+
args = [resolved];
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
command = "npx";
|
|
108
|
+
args = ["-y", "pqc-memory-mcp"];
|
|
109
|
+
}
|
|
110
|
+
rl.close();
|
|
111
|
+
let existing = {};
|
|
112
|
+
if (fs.existsSync(configPath)) {
|
|
113
|
+
try {
|
|
114
|
+
const raw = fs.readFileSync(configPath, "utf8");
|
|
115
|
+
existing = JSON.parse(raw);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
console.error(`Could not parse JSON: ${configPath}`);
|
|
119
|
+
console.error("Move it aside or fix syntax, then run init again.");
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const mcpServers = existing.mcpServers &&
|
|
124
|
+
typeof existing.mcpServers === "object" &&
|
|
125
|
+
!Array.isArray(existing.mcpServers)
|
|
126
|
+
? { ...existing.mcpServers }
|
|
127
|
+
: {};
|
|
128
|
+
mcpServers[serverName] = {
|
|
129
|
+
command,
|
|
130
|
+
args,
|
|
131
|
+
env,
|
|
132
|
+
};
|
|
133
|
+
const out = { ...existing, mcpServers };
|
|
134
|
+
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
135
|
+
fs.writeFileSync(configPath, `${JSON.stringify(out, null, 2)}\n`, "utf8");
|
|
136
|
+
console.log(nextSteps(host, configPath, serverName));
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=init-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-wizard.js","sourceRoot":"","sources":["../src/init-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type McpExchangeTokenPayload = {
|
|
2
|
+
access_token: string;
|
|
3
|
+
refresh_token?: string;
|
|
4
|
+
expires_at: string | number;
|
|
5
|
+
token_type?: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* POST /api/v1/auth/mcp-exchange — Auth0 access JWT → pqc-db TokenPair.
|
|
9
|
+
* Same X-API-Key as tenant-context when PQC_MCP_SERVICE_API_KEY is set.
|
|
10
|
+
*/
|
|
11
|
+
export declare function exchangeAuth0AccessToken(registrationBaseUrl: string, auth0AccessToken: string): Promise<McpExchangeTokenPayload>;
|
|
12
|
+
export type CachedPqcJwt = {
|
|
13
|
+
accessToken: string;
|
|
14
|
+
expiresAtUnixSec: number;
|
|
15
|
+
};
|
|
16
|
+
type CacheEntry = {
|
|
17
|
+
accessToken: string;
|
|
18
|
+
expiresAtMs: number;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Caches pqc-db access JWT keyed by Auth0 token hash (Claude sends the same Auth0 token each request until refresh).
|
|
22
|
+
*/
|
|
23
|
+
export declare class McpExchangeTokenCache {
|
|
24
|
+
private readonly maxEntries;
|
|
25
|
+
private map;
|
|
26
|
+
constructor(maxEntries?: number);
|
|
27
|
+
getEntry(auth0Token: string): CacheEntry | null;
|
|
28
|
+
get(auth0Token: string): string | null;
|
|
29
|
+
/** Cached pqc-db JWT + expiry for MCP auth info (unix seconds). */
|
|
30
|
+
getCachedPqcJwt(auth0Token: string): CachedPqcJwt | null;
|
|
31
|
+
set(auth0Token: string, payload: McpExchangeTokenPayload): void;
|
|
32
|
+
invalidate(auth0Token: string): void;
|
|
33
|
+
}
|
|
34
|
+
export declare function getMcpExchangeCache(): McpExchangeTokenCache;
|
|
35
|
+
/** True if JWT-shaped (three base64url segments); avoids POSTing opaque tokens to exchange. */
|
|
36
|
+
export declare function looksLikeJwt(token: string): boolean;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=mcp-exchange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-exchange.d.ts","sourceRoot":"","sources":["../src/mcp-exchange.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AA0BF;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,mBAAmB,EAAE,MAAM,EAC3B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,uBAAuB,CAAC,CA+ClC;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,KAAK,UAAU,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D;;GAEG;AACH,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,GAAG,CAAiC;gBAEf,UAAU,GAAE,MAAkB;IAE3D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAW/C,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItC,mEAAmE;IACnE,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IASxD,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAW/D,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAGrC;AAID,wBAAgB,mBAAmB,IAAI,qBAAqB,CAK3D;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGnD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mcpDebug } from "./debug.js";
|
|
3
|
+
import { resolutionApiOrigin, TenantResolveError } from "./tenant-fetch.js";
|
|
4
|
+
const CACHE_MAX = 512;
|
|
5
|
+
const SKEW_MS = 30_000;
|
|
6
|
+
function hashToken(token) {
|
|
7
|
+
return createHash("sha256").update(token).digest("hex");
|
|
8
|
+
}
|
|
9
|
+
function parseExpiresAtMs(expiresAt) {
|
|
10
|
+
if (typeof expiresAt === "number" && Number.isFinite(expiresAt)) {
|
|
11
|
+
if (expiresAt > 1e12)
|
|
12
|
+
return expiresAt;
|
|
13
|
+
return expiresAt * 1000;
|
|
14
|
+
}
|
|
15
|
+
const s = String(expiresAt).trim();
|
|
16
|
+
const parsed = Date.parse(s);
|
|
17
|
+
if (!Number.isFinite(parsed)) {
|
|
18
|
+
return Date.now() + 3600_000;
|
|
19
|
+
}
|
|
20
|
+
return parsed;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* POST /api/v1/auth/mcp-exchange — Auth0 access JWT → pqc-db TokenPair.
|
|
24
|
+
* Same X-API-Key as tenant-context when PQC_MCP_SERVICE_API_KEY is set.
|
|
25
|
+
*/
|
|
26
|
+
export async function exchangeAuth0AccessToken(registrationBaseUrl, auth0AccessToken) {
|
|
27
|
+
const base = resolutionApiOrigin(registrationBaseUrl);
|
|
28
|
+
const url = `${base}/api/v1/auth/mcp-exchange`;
|
|
29
|
+
const headers = {
|
|
30
|
+
Authorization: `Bearer ${auth0AccessToken}`,
|
|
31
|
+
"Content-Type": "application/json",
|
|
32
|
+
};
|
|
33
|
+
const serviceKey = process.env.PQC_MCP_SERVICE_API_KEY;
|
|
34
|
+
if (serviceKey) {
|
|
35
|
+
headers["X-API-Key"] = serviceKey;
|
|
36
|
+
}
|
|
37
|
+
mcpDebug("mcp_exchange.request", {
|
|
38
|
+
url,
|
|
39
|
+
hasServiceApiKey: Boolean(serviceKey),
|
|
40
|
+
});
|
|
41
|
+
const response = await fetch(url, { method: "POST", headers });
|
|
42
|
+
const data = (await response.json().catch(() => ({})));
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
const err = typeof data.error === "string" ? data.error : response.statusText || "mcp-exchange failed";
|
|
45
|
+
mcpDebug("mcp_exchange.response", {
|
|
46
|
+
url,
|
|
47
|
+
status: response.status,
|
|
48
|
+
ok: false,
|
|
49
|
+
errorSnippet: err.slice(0, 120),
|
|
50
|
+
});
|
|
51
|
+
throw new TenantResolveError(err, response.status);
|
|
52
|
+
}
|
|
53
|
+
const tokens = data.tokens;
|
|
54
|
+
if (!tokens?.access_token) {
|
|
55
|
+
mcpDebug("mcp_exchange.response", {
|
|
56
|
+
url,
|
|
57
|
+
status: response.status,
|
|
58
|
+
ok: false,
|
|
59
|
+
errorSnippet: "missing tokens.access_token",
|
|
60
|
+
});
|
|
61
|
+
throw new TenantResolveError("Invalid mcp-exchange response: missing tokens.access_token", 502);
|
|
62
|
+
}
|
|
63
|
+
mcpDebug("mcp_exchange.response", { url, status: response.status, ok: true });
|
|
64
|
+
return tokens;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Caches pqc-db access JWT keyed by Auth0 token hash (Claude sends the same Auth0 token each request until refresh).
|
|
68
|
+
*/
|
|
69
|
+
export class McpExchangeTokenCache {
|
|
70
|
+
maxEntries;
|
|
71
|
+
map = new Map();
|
|
72
|
+
constructor(maxEntries = CACHE_MAX) {
|
|
73
|
+
this.maxEntries = maxEntries;
|
|
74
|
+
}
|
|
75
|
+
getEntry(auth0Token) {
|
|
76
|
+
const key = hashToken(auth0Token);
|
|
77
|
+
const e = this.map.get(key);
|
|
78
|
+
if (!e)
|
|
79
|
+
return null;
|
|
80
|
+
if (Date.now() >= e.expiresAtMs - SKEW_MS) {
|
|
81
|
+
this.map.delete(key);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return e;
|
|
85
|
+
}
|
|
86
|
+
get(auth0Token) {
|
|
87
|
+
return this.getEntry(auth0Token)?.accessToken ?? null;
|
|
88
|
+
}
|
|
89
|
+
/** Cached pqc-db JWT + expiry for MCP auth info (unix seconds). */
|
|
90
|
+
getCachedPqcJwt(auth0Token) {
|
|
91
|
+
const e = this.getEntry(auth0Token);
|
|
92
|
+
if (!e)
|
|
93
|
+
return null;
|
|
94
|
+
return {
|
|
95
|
+
accessToken: e.accessToken,
|
|
96
|
+
expiresAtUnixSec: Math.floor(e.expiresAtMs / 1000),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
set(auth0Token, payload) {
|
|
100
|
+
const key = hashToken(auth0Token);
|
|
101
|
+
const expiresAtMs = parseExpiresAtMs(payload.expires_at);
|
|
102
|
+
while (this.map.size >= this.maxEntries) {
|
|
103
|
+
const first = this.map.keys().next().value;
|
|
104
|
+
if (first === undefined)
|
|
105
|
+
break;
|
|
106
|
+
this.map.delete(first);
|
|
107
|
+
}
|
|
108
|
+
this.map.set(key, { accessToken: payload.access_token, expiresAtMs });
|
|
109
|
+
}
|
|
110
|
+
invalidate(auth0Token) {
|
|
111
|
+
this.map.delete(hashToken(auth0Token));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
let sharedExchangeCache = null;
|
|
115
|
+
export function getMcpExchangeCache() {
|
|
116
|
+
if (!sharedExchangeCache) {
|
|
117
|
+
sharedExchangeCache = new McpExchangeTokenCache();
|
|
118
|
+
}
|
|
119
|
+
return sharedExchangeCache;
|
|
120
|
+
}
|
|
121
|
+
/** True if JWT-shaped (three base64url segments); avoids POSTing opaque tokens to exchange. */
|
|
122
|
+
export function looksLikeJwt(token) {
|
|
123
|
+
const parts = token.split(".");
|
|
124
|
+
return parts.length === 3 && parts.every((p) => p.length > 0);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=mcp-exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-exchange.js","sourceRoot":"","sources":["../src/mcp-exchange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAa5E,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,OAAO,GAAG,MAAM,CAAC;AAEvB,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,gBAAgB,CAAC,SAA0B;IAClD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChE,IAAI,SAAS,GAAG,IAAI;YAAE,OAAO,SAAS,CAAC;QACvC,OAAO,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,mBAA2B,EAC3B,gBAAwB;IAExB,MAAM,IAAI,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,IAAI,2BAA2B,CAAC;IAE/C,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,gBAAgB,EAAE;QAC3C,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACvD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,sBAAsB,EAAE;QAC/B,GAAG;QACH,gBAAgB,EAAE,OAAO,CAAC,UAAU,CAAC;KACtC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAEpD,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,GAAG,GACP,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,qBAAqB,CAAC;QAC7F,QAAQ,CAAC,uBAAuB,EAAE;YAChC,GAAG;YACH,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,EAAE,EAAE,KAAK;YACT,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,IAAI,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;QAC1B,QAAQ,CAAC,uBAAuB,EAAE;YAChC,GAAG;YACH,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,EAAE,EAAE,KAAK;YACT,YAAY,EAAE,6BAA6B;SAC5C,CAAC,CAAC;QACH,MAAM,IAAI,kBAAkB,CAAC,4DAA4D,EAAE,GAAG,CAAC,CAAC;IAClG,CAAC;IAED,QAAQ,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC;AAChB,CAAC;AAMD;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAGH;IAFrB,GAAG,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE5C,YAA6B,aAAqB,SAAS;QAA9B,eAAU,GAAV,UAAU,CAAoB;IAAG,CAAC;IAE/D,QAAQ,CAAC,UAAkB;QACzB,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG,CAAC,UAAkB;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,IAAI,IAAI,CAAC;IACxD,CAAC;IAED,mEAAmE;IACnE,eAAe,CAAC,UAAkB;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,OAAO;YACL,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,UAAkB,EAAE,OAAgC;QACtD,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC3C,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM;YAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,UAAU,CAAC,UAAkB;QAC3B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,CAAC;CACF;AAED,IAAI,mBAAmB,GAAiC,IAAI,CAAC;AAE7D,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,mBAAmB,GAAG,IAAI,qBAAqB,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import type { TenantRuntime } from "./tenant-runtime.js";
|
|
3
|
+
export type RuntimeResolver = (extra?: {
|
|
4
|
+
authInfo?: unknown;
|
|
5
|
+
} | undefined) => Promise<TenantRuntime>;
|
|
6
|
+
export declare function attachPqcToolHandlers(server: Server, resolveRuntime: RuntimeResolver): void;
|
|
7
|
+
export declare function createPqcMcpServer(resolveRuntime: RuntimeResolver): Server;
|
|
8
|
+
//# sourceMappingURL=server-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-factory.d.ts","sourceRoot":"","sources":["../src/server-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAMnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,KACvC,OAAO,CAAC,aAAa,CAAC,CAAC;AAI5B,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,eAAe,GAC9B,IAAI,CAkBN;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,eAAe,GAAG,MAAM,CAO1E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import { buildToolList } from "./tool-definitions.js";
|
|
4
|
+
import { invokeTool } from "./tool-dispatch.js";
|
|
5
|
+
const tools = buildToolList();
|
|
6
|
+
export function attachPqcToolHandlers(server, resolveRuntime) {
|
|
7
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
|
|
8
|
+
server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
|
|
9
|
+
const { name, arguments: args } = request.params;
|
|
10
|
+
try {
|
|
11
|
+
const rtx = await resolveRuntime(extra);
|
|
12
|
+
return await invokeTool(name, args, rtx);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
const message = error instanceof Error ? error.message : "Unknown error occurred";
|
|
16
|
+
console.error(`[pqc-memory] Tool ${name} failed:`, error);
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
19
|
+
isError: true,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function createPqcMcpServer(resolveRuntime) {
|
|
25
|
+
const server = new Server({ name: "pqc-memory", version: "1.0.0" }, { capabilities: { tools: {} } });
|
|
26
|
+
attachPqcToolHandlers(server, resolveRuntime);
|
|
27
|
+
return server;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=server-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-factory.js","sourceRoot":"","sources":["../src/server-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMhD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;AAE9B,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,cAA+B;IAE/B,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE1E,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBACtD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,cAA+B;IAChE,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EACxC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IACF,qBAAqB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|