@atbas/m-mcp 0.1.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 +21 -0
- package/README.md +364 -0
- package/dist/builder/transaction-builder.d.ts +53 -0
- package/dist/builder/transaction-builder.d.ts.map +1 -0
- package/dist/builder/transaction-builder.js +159 -0
- package/dist/builder/transaction-builder.js.map +1 -0
- package/dist/catalogue/default-catalogue.d.ts +18 -0
- package/dist/catalogue/default-catalogue.d.ts.map +1 -0
- package/dist/catalogue/default-catalogue.js +21 -0
- package/dist/catalogue/default-catalogue.js.map +1 -0
- package/dist/catalogue/endpoints.d.ts +22 -0
- package/dist/catalogue/endpoints.d.ts.map +1 -0
- package/dist/catalogue/endpoints.js +24 -0
- package/dist/catalogue/endpoints.js.map +1 -0
- package/dist/catalogue/flows.d.ts +32 -0
- package/dist/catalogue/flows.d.ts.map +1 -0
- package/dist/catalogue/flows.js +64 -0
- package/dist/catalogue/flows.js.map +1 -0
- package/dist/catalogue/hash-options.d.ts +112 -0
- package/dist/catalogue/hash-options.d.ts.map +1 -0
- package/dist/catalogue/hash-options.js +151 -0
- package/dist/catalogue/hash-options.js.map +1 -0
- package/dist/catalogue/types.d.ts +279 -0
- package/dist/catalogue/types.d.ts.map +1 -0
- package/dist/catalogue/types.js +360 -0
- package/dist/catalogue/types.js.map +1 -0
- package/dist/codegen/generate.d.ts +14 -0
- package/dist/codegen/generate.d.ts.map +1 -0
- package/dist/codegen/generate.js +490 -0
- package/dist/codegen/generate.js.map +1 -0
- package/dist/codegen/languages/node.d.ts +3 -0
- package/dist/codegen/languages/node.d.ts.map +1 -0
- package/dist/codegen/languages/node.js +32 -0
- package/dist/codegen/languages/node.js.map +1 -0
- package/dist/codegen/languages/php.d.ts +3 -0
- package/dist/codegen/languages/php.d.ts.map +1 -0
- package/dist/codegen/languages/php.js +27 -0
- package/dist/codegen/languages/php.js.map +1 -0
- package/dist/codegen/languages/python.d.ts +3 -0
- package/dist/codegen/languages/python.d.ts.map +1 -0
- package/dist/codegen/languages/python.js +27 -0
- package/dist/codegen/languages/python.js.map +1 -0
- package/dist/codegen/renderer.d.ts +24 -0
- package/dist/codegen/renderer.d.ts.map +1 -0
- package/dist/codegen/renderer.js +59 -0
- package/dist/codegen/renderer.js.map +1 -0
- package/dist/codegen/types.d.ts +50 -0
- package/dist/codegen/types.d.ts.map +1 -0
- package/dist/codegen/types.js +5 -0
- package/dist/codegen/types.js.map +1 -0
- package/dist/config/credentials.d.ts +64 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +216 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/environment.d.ts +23 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +54 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/core/dependencies.d.ts +43 -0
- package/dist/core/dependencies.d.ts.map +1 -0
- package/dist/core/dependencies.js +2 -0
- package/dist/core/dependencies.js.map +1 -0
- package/dist/core/registry.d.ts +33 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +13 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/server.d.ts +61 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +90 -0
- package/dist/core/server.js.map +1 -0
- package/dist/dependencies.d.ts +28 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +2 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/diagnostics/diagnose.d.ts +43 -0
- package/dist/diagnostics/diagnose.d.ts.map +1 -0
- package/dist/diagnostics/diagnose.js +121 -0
- package/dist/diagnostics/diagnose.js.map +1 -0
- package/dist/domain/amount.d.ts +157 -0
- package/dist/domain/amount.d.ts.map +1 -0
- package/dist/domain/amount.js +275 -0
- package/dist/domain/amount.js.map +1 -0
- package/dist/domain/datetime.d.ts +95 -0
- package/dist/domain/datetime.d.ts.map +1 -0
- package/dist/domain/datetime.js +211 -0
- package/dist/domain/datetime.js.map +1 -0
- package/dist/domain/response-codes.d.ts +116 -0
- package/dist/domain/response-codes.d.ts.map +1 -0
- package/dist/domain/response-codes.js +380 -0
- package/dist/domain/response-codes.js.map +1 -0
- package/dist/domain/secure-hash.d.ts +78 -0
- package/dist/domain/secure-hash.d.ts.map +1 -0
- package/dist/domain/secure-hash.js +69 -0
- package/dist/domain/secure-hash.js.map +1 -0
- package/dist/domain/signature/jazzcash.d.ts +56 -0
- package/dist/domain/signature/jazzcash.d.ts.map +1 -0
- package/dist/domain/signature/jazzcash.js +214 -0
- package/dist/domain/signature/jazzcash.js.map +1 -0
- package/dist/domain/signature/registry.d.ts +69 -0
- package/dist/domain/signature/registry.d.ts.map +1 -0
- package/dist/domain/signature/registry.js +92 -0
- package/dist/domain/signature/registry.js.map +1 -0
- package/dist/domain/signature/scheme.d.ts +349 -0
- package/dist/domain/signature/scheme.d.ts.map +1 -0
- package/dist/domain/signature/scheme.js +398 -0
- package/dist/domain/signature/scheme.js.map +1 -0
- package/dist/domain/txn-ref.d.ts +76 -0
- package/dist/domain/txn-ref.d.ts.map +1 -0
- package/dist/domain/txn-ref.js +126 -0
- package/dist/domain/txn-ref.js.map +1 -0
- package/dist/domain/types.d.ts +45 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +70 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/errors.d.ts +84 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +87 -0
- package/dist/errors.js.map +1 -0
- package/dist/gateway/checkout-form.d.ts +16 -0
- package/dist/gateway/checkout-form.d.ts.map +1 -0
- package/dist/gateway/checkout-form.js +103 -0
- package/dist/gateway/checkout-form.js.map +1 -0
- package/dist/gateway/checkout-output.d.ts +70 -0
- package/dist/gateway/checkout-output.d.ts.map +1 -0
- package/dist/gateway/checkout-output.js +199 -0
- package/dist/gateway/checkout-output.js.map +1 -0
- package/dist/gateway/guards.d.ts +37 -0
- package/dist/gateway/guards.d.ts.map +1 -0
- package/dist/gateway/guards.js +44 -0
- package/dist/gateway/guards.js.map +1 -0
- package/dist/gateway/http-client.d.ts +42 -0
- package/dist/gateway/http-client.d.ts.map +1 -0
- package/dist/gateway/http-client.js +153 -0
- package/dist/gateway/http-client.js.map +1 -0
- package/dist/gateway/rest-client.d.ts +42 -0
- package/dist/gateway/rest-client.d.ts.map +1 -0
- package/dist/gateway/rest-client.js +241 -0
- package/dist/gateway/rest-client.js.map +1 -0
- package/dist/gateway/transport.d.ts +31 -0
- package/dist/gateway/transport.d.ts.map +1 -0
- package/dist/gateway/transport.js +73 -0
- package/dist/gateway/transport.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/install/cli.d.ts +38 -0
- package/dist/install/cli.d.ts.map +1 -0
- package/dist/install/cli.js +274 -0
- package/dist/install/cli.js.map +1 -0
- package/dist/install/harnesses.d.ts +74 -0
- package/dist/install/harnesses.d.ts.map +1 -0
- package/dist/install/harnesses.js +263 -0
- package/dist/install/harnesses.js.map +1 -0
- package/dist/knowledge/corpus.d.ts +15 -0
- package/dist/knowledge/corpus.d.ts.map +1 -0
- package/dist/knowledge/corpus.js +129 -0
- package/dist/knowledge/corpus.js.map +1 -0
- package/dist/knowledge/search.d.ts +29 -0
- package/dist/knowledge/search.d.ts.map +1 -0
- package/dist/knowledge/search.js +181 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/knowledge/source.d.ts +60 -0
- package/dist/knowledge/source.d.ts.map +1 -0
- package/dist/knowledge/source.js +91 -0
- package/dist/knowledge/source.js.map +1 -0
- package/dist/knowledge/types.d.ts +40 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +19 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/paths.d.ts +26 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +106 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompts/integration-walkthrough.d.ts +11 -0
- package/dist/prompts/integration-walkthrough.d.ts.map +1 -0
- package/dist/prompts/integration-walkthrough.js +52 -0
- package/dist/prompts/integration-walkthrough.js.map +1 -0
- package/dist/prompts/register.d.ts +4 -0
- package/dist/prompts/register.d.ts.map +1 -0
- package/dist/prompts/register.js +4 -0
- package/dist/prompts/register.js.map +1 -0
- package/dist/registry.d.ts +14 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -0
- package/dist/resources/knowledge-resources.d.ts +5 -0
- package/dist/resources/knowledge-resources.d.ts.map +1 -0
- package/dist/resources/knowledge-resources.js +121 -0
- package/dist/resources/knowledge-resources.js.map +1 -0
- package/dist/resources/register.d.ts +4 -0
- package/dist/resources/register.d.ts.map +1 -0
- package/dist/resources/register.js +8 -0
- package/dist/resources/register.js.map +1 -0
- package/dist/server.d.ts +40 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +56 -0
- package/dist/server.js.map +1 -0
- package/dist/telemetry/logger.d.ts +31 -0
- package/dist/telemetry/logger.d.ts.map +1 -0
- package/dist/telemetry/logger.js +67 -0
- package/dist/telemetry/logger.js.map +1 -0
- package/dist/telemetry/redaction.d.ts +88 -0
- package/dist/telemetry/redaction.d.ts.map +1 -0
- package/dist/telemetry/redaction.js +238 -0
- package/dist/telemetry/redaction.js.map +1 -0
- package/dist/tools/build-transaction-parameters.d.ts +10 -0
- package/dist/tools/build-transaction-parameters.d.ts.map +1 -0
- package/dist/tools/build-transaction-parameters.js +154 -0
- package/dist/tools/build-transaction-parameters.js.map +1 -0
- package/dist/tools/call-context.d.ts +47 -0
- package/dist/tools/call-context.d.ts.map +1 -0
- package/dist/tools/call-context.js +15 -0
- package/dist/tools/call-context.js.map +1 -0
- package/dist/tools/codegen-tools.d.ts +4 -0
- package/dist/tools/codegen-tools.d.ts.map +1 -0
- package/dist/tools/codegen-tools.js +131 -0
- package/dist/tools/codegen-tools.js.map +1 -0
- package/dist/tools/credential-tools.d.ts +32 -0
- package/dist/tools/credential-tools.d.ts.map +1 -0
- package/dist/tools/credential-tools.js +65 -0
- package/dist/tools/credential-tools.js.map +1 -0
- package/dist/tools/descriptor.d.ts +52 -0
- package/dist/tools/descriptor.d.ts.map +1 -0
- package/dist/tools/descriptor.js +2 -0
- package/dist/tools/descriptor.js.map +1 -0
- package/dist/tools/diagnostic-tools.d.ts +3 -0
- package/dist/tools/diagnostic-tools.d.ts.map +1 -0
- package/dist/tools/diagnostic-tools.js +128 -0
- package/dist/tools/diagnostic-tools.js.map +1 -0
- package/dist/tools/gateway-tools.d.ts +6 -0
- package/dist/tools/gateway-tools.d.ts.map +1 -0
- package/dist/tools/gateway-tools.js +381 -0
- package/dist/tools/gateway-tools.js.map +1 -0
- package/dist/tools/hash-tools.d.ts +5 -0
- package/dist/tools/hash-tools.d.ts.map +1 -0
- package/dist/tools/hash-tools.js +238 -0
- package/dist/tools/hash-tools.js.map +1 -0
- package/dist/tools/knowledge-tools.d.ts +7 -0
- package/dist/tools/knowledge-tools.d.ts.map +1 -0
- package/dist/tools/knowledge-tools.js +247 -0
- package/dist/tools/knowledge-tools.js.map +1 -0
- package/dist/tools/onboarding-checklist.d.ts +3 -0
- package/dist/tools/onboarding-checklist.d.ts.map +1 -0
- package/dist/tools/onboarding-checklist.js +141 -0
- package/dist/tools/onboarding-checklist.js.map +1 -0
- package/dist/tools/register.d.ts +60 -0
- package/dist/tools/register.d.ts.map +1 -0
- package/dist/tools/register.js +145 -0
- package/dist/tools/register.js.map +1 -0
- package/dist/tools/tool-kit.d.ts +88 -0
- package/dist/tools/tool-kit.d.ts.map +1 -0
- package/dist/tools/tool-kit.js +297 -0
- package/dist/tools/tool-kit.js.map +1 -0
- package/dist/validation/payload-validator.d.ts +29 -0
- package/dist/validation/payload-validator.d.ts.map +1 -0
- package/dist/validation/payload-validator.js +79 -0
- package/dist/validation/payload-validator.js.map +1 -0
- package/dist/validation/rules/amount.d.ts +3 -0
- package/dist/validation/rules/amount.d.ts.map +1 -0
- package/dist/validation/rules/amount.js +77 -0
- package/dist/validation/rules/amount.js.map +1 -0
- package/dist/validation/rules/bill-reference.d.ts +10 -0
- package/dist/validation/rules/bill-reference.d.ts.map +1 -0
- package/dist/validation/rules/bill-reference.js +34 -0
- package/dist/validation/rules/bill-reference.js.map +1 -0
- package/dist/validation/rules/cnic.d.ts +3 -0
- package/dist/validation/rules/cnic.d.ts.map +1 -0
- package/dist/validation/rules/cnic.js +42 -0
- package/dist/validation/rules/cnic.js.map +1 -0
- package/dist/validation/rules/constants.d.ts +9 -0
- package/dist/validation/rules/constants.d.ts.map +1 -0
- package/dist/validation/rules/constants.js +28 -0
- package/dist/validation/rules/constants.js.map +1 -0
- package/dist/validation/rules/constraints.d.ts +3 -0
- package/dist/validation/rules/constraints.d.ts.map +1 -0
- package/dist/validation/rules/constraints.js +113 -0
- package/dist/validation/rules/constraints.js.map +1 -0
- package/dist/validation/rules/datetime.d.ts +3 -0
- package/dist/validation/rules/datetime.d.ts.map +1 -0
- package/dist/validation/rules/datetime.js +49 -0
- package/dist/validation/rules/datetime.js.map +1 -0
- package/dist/validation/rules/empty-string.d.ts +13 -0
- package/dist/validation/rules/empty-string.d.ts.map +1 -0
- package/dist/validation/rules/empty-string.js +32 -0
- package/dist/validation/rules/empty-string.js.map +1 -0
- package/dist/validation/rules/expiry.d.ts +3 -0
- package/dist/validation/rules/expiry.d.ts.map +1 -0
- package/dist/validation/rules/expiry.js +52 -0
- package/dist/validation/rules/expiry.js.map +1 -0
- package/dist/validation/rules/msisdn.d.ts +3 -0
- package/dist/validation/rules/msisdn.d.ts.map +1 -0
- package/dist/validation/rules/msisdn.js +45 -0
- package/dist/validation/rules/msisdn.js.map +1 -0
- package/dist/validation/rules/presence.d.ts +3 -0
- package/dist/validation/rules/presence.d.ts.map +1 -0
- package/dist/validation/rules/presence.js +90 -0
- package/dist/validation/rules/presence.js.map +1 -0
- package/dist/validation/rules/return-url.d.ts +14 -0
- package/dist/validation/rules/return-url.d.ts.map +1 -0
- package/dist/validation/rules/return-url.js +58 -0
- package/dist/validation/rules/return-url.js.map +1 -0
- package/dist/validation/rules/tool-argument.d.ts +16 -0
- package/dist/validation/rules/tool-argument.d.ts.map +1 -0
- package/dist/validation/rules/tool-argument.js +38 -0
- package/dist/validation/rules/tool-argument.js.map +1 -0
- package/dist/validation/rules/txn-ref.d.ts +3 -0
- package/dist/validation/rules/txn-ref.d.ts.map +1 -0
- package/dist/validation/rules/txn-ref.js +47 -0
- package/dist/validation/rules/txn-ref.js.map +1 -0
- package/dist/validation/rules/unknown-fields.d.ts +10 -0
- package/dist/validation/rules/unknown-fields.d.ts.map +1 -0
- package/dist/validation/rules/unknown-fields.js +29 -0
- package/dist/validation/rules/unknown-fields.js.map +1 -0
- package/dist/validation/types.d.ts +36 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +12 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/version.d.ts +23 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/knowledge/diagnostics/symptoms.json +321 -0
- package/knowledge/docs/bnpl-guide.md +77 -0
- package/knowledge/docs/card-page-redirection.md +67 -0
- package/knowledge/docs/card-refund.md +91 -0
- package/knowledge/docs/hmac-sha256-calculation.md +72 -0
- package/knowledge/docs/index.json +189 -0
- package/knowledge/docs/ipn-implementation.md +89 -0
- package/knowledge/docs/mwallet-recurring.md +117 -0
- package/knowledge/docs/mwallet-refund.md +65 -0
- package/knowledge/docs/mwallet-rest-v1-1.md +126 -0
- package/knowledge/docs/mwallet-rest-v2-0-cnic.md +113 -0
- package/knowledge/docs/portal-guide.md +45 -0
- package/knowledge/docs/shopify-guide.md +74 -0
- package/knowledge/docs/status-inquiry-2025-26.md +32 -0
- package/knowledge/docs/status-inquiry.md +111 -0
- package/knowledge/docs/wordpress-guide.md +49 -0
- package/knowledge/flow.schema.json +390 -0
- package/knowledge/flows/bnpl-page-redirection-v1.1.json +211 -0
- package/knowledge/flows/card-page-redirection-v1.1.json +211 -0
- package/knowledge/flows/mwallet-rest-v1.1.json +187 -0
- package/knowledge/flows/mwallet-rest-v2.0-cnic.json +197 -0
- package/knowledge/flows/mwallet-token-pay-v4.0.json +130 -0
- package/knowledge/flows/refund-bnpl.json +105 -0
- package/knowledge/flows/refund-card-v1.1.json +112 -0
- package/knowledge/flows/refund-card-v2.0.json +121 -0
- package/knowledge/flows/refund-mwallet-v1.1.json +106 -0
- package/knowledge/flows/status-inquiry-v1.1.json +102 -0
- package/knowledge/flows/status-inquiry-v2.0.json +103 -0
- package/knowledge/flows/token-delete-v1.json +85 -0
- package/knowledge/flows/token-inquiry-v1.json +85 -0
- package/knowledge/flows/wallet-linking-portal.json +103 -0
- package/knowledge/templates/node/checkout-redirect.tmpl +166 -0
- package/knowledge/templates/node/ipn-handler.tmpl +108 -0
- package/knowledge/templates/node/rest-client.tmpl +197 -0
- package/knowledge/templates/node/wallet-linking.tmpl +147 -0
- package/knowledge/templates/php/checkout-redirect.tmpl +149 -0
- package/knowledge/templates/php/ipn-handler.tmpl +105 -0
- package/knowledge/templates/php/rest-client.tmpl +191 -0
- package/knowledge/templates/php/wallet-linking.tmpl +137 -0
- package/knowledge/templates/python/checkout-redirect.tmpl +148 -0
- package/knowledge/templates/python/ipn-handler.tmpl +110 -0
- package/knowledge/templates/python/rest-client.tmpl +179 -0
- package/knowledge/templates/python/wallet-linking.tmpl +133 -0
- package/package.json +84 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { createInterface } from 'node:readline/promises';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { packageRoot } from '../paths.js';
|
|
6
|
+
import { SERVER_NAME } from '../version.js';
|
|
7
|
+
import { HARNESSES, findHarness, readJsonMcpServer, tomlHasMcpServer, upsertJsonMcpServer, upsertTomlMcpServer, } from './harnesses.js';
|
|
8
|
+
export function parseArguments(argv) {
|
|
9
|
+
const targets = [];
|
|
10
|
+
let all = false;
|
|
11
|
+
let list = false;
|
|
12
|
+
let remove = false;
|
|
13
|
+
let dryRun = false;
|
|
14
|
+
let name = SERVER_NAME;
|
|
15
|
+
let help = false;
|
|
16
|
+
for (const argument of argv) {
|
|
17
|
+
if (argument === '--all')
|
|
18
|
+
all = true;
|
|
19
|
+
else if (argument === '--list')
|
|
20
|
+
list = true;
|
|
21
|
+
else if (argument === '--remove' || argument === '--uninstall')
|
|
22
|
+
remove = true;
|
|
23
|
+
else if (argument === '--dry-run')
|
|
24
|
+
dryRun = true;
|
|
25
|
+
else if (argument === '--help' || argument === '-h')
|
|
26
|
+
help = true;
|
|
27
|
+
else if (argument.startsWith('--target='))
|
|
28
|
+
targets.push(...argument.slice('--target='.length).split(','));
|
|
29
|
+
else if (argument.startsWith('--name='))
|
|
30
|
+
name = argument.slice('--name='.length);
|
|
31
|
+
}
|
|
32
|
+
return { targets: targets.map((value) => value.trim()).filter(Boolean), all, list, remove, dryRun, name, help };
|
|
33
|
+
}
|
|
34
|
+
const USAGE = `
|
|
35
|
+
Register the JazzCash MCP server with your AI harness.
|
|
36
|
+
|
|
37
|
+
npm run deploy pick interactively
|
|
38
|
+
npm run deploy -- --list show what is detected and what is installed
|
|
39
|
+
npm run deploy -- --all install into every detected harness
|
|
40
|
+
npm run deploy -- --target=claude,codex
|
|
41
|
+
npm run deploy -- --remove --all uninstall
|
|
42
|
+
npm run deploy -- --dry-run --all show the changes without writing
|
|
43
|
+
|
|
44
|
+
Harnesses: ${HARNESSES.map((harness) => harness.id).join(', ')}
|
|
45
|
+
|
|
46
|
+
Credentials are optional. 13 of the 17 tools — documentation, code generation,
|
|
47
|
+
hash checking, validation, diagnosis — need none. The four that call the gateway
|
|
48
|
+
read them from the process environment: set them in your harness's own "env"
|
|
49
|
+
block, or point JAZZCASH_CREDENTIALS_FILE at a file kept outside any repository.
|
|
50
|
+
`;
|
|
51
|
+
export function inspect(harness, name) {
|
|
52
|
+
const present = harness.configPaths().filter((path) => existsSync(path));
|
|
53
|
+
const installed = present.some((path) => {
|
|
54
|
+
try {
|
|
55
|
+
const contents = readFileSync(path, 'utf8');
|
|
56
|
+
return harness.format === 'json'
|
|
57
|
+
? readJsonMcpServer(contents, name) !== undefined
|
|
58
|
+
: tomlHasMcpServer(contents, name);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return { harness, present, installed };
|
|
65
|
+
}
|
|
66
|
+
function serverEntry() {
|
|
67
|
+
// Absolute, forward-slashed: every harness accepts it and it avoids the
|
|
68
|
+
// backslash-escaping differences between JSON and TOML.
|
|
69
|
+
const entry = join(packageRoot(), 'dist', 'index.js').replace(/\\/g, '/');
|
|
70
|
+
return { command: process.execPath.replace(/\\/g, '/'), args: [entry] };
|
|
71
|
+
}
|
|
72
|
+
function backup(path) {
|
|
73
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
74
|
+
const target = `${path}.jazzcash-backup-${stamp}`;
|
|
75
|
+
// The copy is byte-for-byte, so it carries the `env` blocks of every other
|
|
76
|
+
// server in the file — API tokens included. It is therefore created readable
|
|
77
|
+
// and writable by its owner only. Windows ignores the mode bits; there the
|
|
78
|
+
// backup inherits the ACL of the directory the original already sits in.
|
|
79
|
+
writeFileSync(target, readFileSync(path), { mode: 0o600 });
|
|
80
|
+
return target;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Replace a file's contents without ever leaving it half-written.
|
|
84
|
+
*
|
|
85
|
+
* The target holds every other MCP server the user has configured. Overwriting
|
|
86
|
+
* it in place turns an interrupted write into a truncated, unparseable config;
|
|
87
|
+
* writing a sibling temporary file and renaming it over the target makes the
|
|
88
|
+
* replacement atomic on POSIX and on Windows alike.
|
|
89
|
+
*/
|
|
90
|
+
function writeAtomically(path, contents) {
|
|
91
|
+
const temporaryPath = `${path}.jazzcash-tmp-${String(process.pid)}`;
|
|
92
|
+
try {
|
|
93
|
+
writeFileSync(temporaryPath, contents, 'utf8');
|
|
94
|
+
renameSync(temporaryPath, path);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
rmSync(temporaryPath, { force: true });
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function applyToFile(harness, path, name, entry, dryRun) {
|
|
102
|
+
const exists = existsSync(path);
|
|
103
|
+
if (!exists && !harness.createIfMissing) {
|
|
104
|
+
return { path, action: 'skipped', reason: 'configuration file not found; is the harness installed?' };
|
|
105
|
+
}
|
|
106
|
+
const current = exists ? readFileSync(path, 'utf8') : '';
|
|
107
|
+
const updated = harness.format === 'json' ? upsertJsonMcpServer(current, name, entry) : upsertTomlMcpServer(current, name, entry);
|
|
108
|
+
if (updated === current) {
|
|
109
|
+
return { path, action: 'skipped', reason: 'already up to date' };
|
|
110
|
+
}
|
|
111
|
+
if (dryRun) {
|
|
112
|
+
return { path, action: 'would-write' };
|
|
113
|
+
}
|
|
114
|
+
const backupPath = exists ? backup(path) : undefined;
|
|
115
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
116
|
+
writeAtomically(path, updated);
|
|
117
|
+
return backupPath === undefined ? { path, action: 'written' } : { path, action: 'written', backupPath };
|
|
118
|
+
}
|
|
119
|
+
export function apply(state, name, remove, dryRun) {
|
|
120
|
+
const entry = remove ? undefined : serverEntry();
|
|
121
|
+
const paths = state.present.length > 0
|
|
122
|
+
? state.present
|
|
123
|
+
: state.harness.createIfMissing
|
|
124
|
+
? [state.harness.configPaths()[0] ?? '']
|
|
125
|
+
: [];
|
|
126
|
+
if (paths.length === 0) {
|
|
127
|
+
return [{ path: state.harness.configPaths()[0] ?? '(unknown)', action: 'skipped', reason: 'harness not detected' }];
|
|
128
|
+
}
|
|
129
|
+
return paths.map((path) => applyToFile(state.harness, path, name, entry, dryRun));
|
|
130
|
+
}
|
|
131
|
+
async function chooseInteractively(states) {
|
|
132
|
+
if (!process.stdin.isTTY) {
|
|
133
|
+
throw new Error('No terminal available for the interactive picker. Use --target=<ids>, --all or --list.');
|
|
134
|
+
}
|
|
135
|
+
process.stdout.write('\nWhich harnesses should the JazzCash MCP server be installed into?\n\n');
|
|
136
|
+
states.forEach((state, index) => {
|
|
137
|
+
const detected = state.present.length > 0 ? 'detected' : 'not detected';
|
|
138
|
+
const installed = state.installed ? ', already installed' : '';
|
|
139
|
+
process.stdout.write(` ${String(index + 1)}. ${state.harness.label} (${detected}${installed})\n`);
|
|
140
|
+
});
|
|
141
|
+
process.stdout.write(' a. all detected\n\n');
|
|
142
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
143
|
+
try {
|
|
144
|
+
const answer = (await rl.question('Select (e.g. 1,3 or a): ')).trim().toLowerCase();
|
|
145
|
+
if (answer === 'a' || answer === 'all') {
|
|
146
|
+
return states.filter((state) => state.present.length > 0).map((state) => state.harness.id);
|
|
147
|
+
}
|
|
148
|
+
return answer
|
|
149
|
+
.split(',')
|
|
150
|
+
.map((token) => Number.parseInt(token.trim(), 10))
|
|
151
|
+
.filter((index) => Number.isInteger(index) && index >= 1 && index <= states.length)
|
|
152
|
+
.map((index) => states[index - 1]?.harness.id ?? '')
|
|
153
|
+
.filter(Boolean);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
rl.close();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function reportList(states, name) {
|
|
160
|
+
process.stdout.write(`\nMCP server name: ${name}\n`);
|
|
161
|
+
process.stdout.write(`Server entry: ${serverEntry().command} ${serverEntry().args.join(' ')}\n\n`);
|
|
162
|
+
for (const state of states) {
|
|
163
|
+
const detected = state.present.length > 0;
|
|
164
|
+
process.stdout.write(` ${state.harness.label.padEnd(14)} ${detected ? 'detected' : 'not detected'}`);
|
|
165
|
+
process.stdout.write(state.installed ? ' [installed]\n' : '\n');
|
|
166
|
+
for (const path of state.present) {
|
|
167
|
+
process.stdout.write(` ${path}\n`);
|
|
168
|
+
}
|
|
169
|
+
if (!detected) {
|
|
170
|
+
process.stdout.write(` would create ${state.harness.configPaths()[0] ?? ''}\n`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
process.stdout.write('\n');
|
|
174
|
+
}
|
|
175
|
+
async function main() {
|
|
176
|
+
const options = parseArguments(process.argv.slice(2));
|
|
177
|
+
if (options.help) {
|
|
178
|
+
process.stdout.write(USAGE);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const distEntry = join(packageRoot(), 'dist', 'index.js');
|
|
182
|
+
if (!existsSync(distEntry)) {
|
|
183
|
+
throw new Error(`${distEntry} does not exist. Run "npm run build" first.`);
|
|
184
|
+
}
|
|
185
|
+
const states = HARNESSES.map((harness) => inspect(harness, options.name));
|
|
186
|
+
if (options.list) {
|
|
187
|
+
reportList(states, options.name);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
let selected;
|
|
191
|
+
if (options.all) {
|
|
192
|
+
selected = states.map((state) => state.harness.id);
|
|
193
|
+
}
|
|
194
|
+
else if (options.targets.length > 0) {
|
|
195
|
+
const unknown = options.targets.filter((target) => findHarness(target) === undefined);
|
|
196
|
+
if (unknown.length > 0) {
|
|
197
|
+
throw new Error(`Unknown harness: ${unknown.join(', ')}. Known: ${HARNESSES.map((h) => h.id).join(', ')}.`);
|
|
198
|
+
}
|
|
199
|
+
selected = options.targets;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
selected = await chooseInteractively(states);
|
|
203
|
+
}
|
|
204
|
+
if (selected.length === 0) {
|
|
205
|
+
process.stdout.write('Nothing selected. No changes made.\n');
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const verb = options.remove ? 'Removing' : 'Installing';
|
|
209
|
+
process.stdout.write(`\n${verb} "${options.name}"${options.dryRun ? ' (dry run)' : ''}\n\n`);
|
|
210
|
+
let changed = 0;
|
|
211
|
+
let backedUp = 0;
|
|
212
|
+
for (const id of selected) {
|
|
213
|
+
const state = states.find((candidate) => candidate.harness.id === id);
|
|
214
|
+
if (state === undefined) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
process.stdout.write(` ${state.harness.label}\n`);
|
|
218
|
+
for (const outcome of apply(state, options.name, options.remove, options.dryRun)) {
|
|
219
|
+
if (outcome.action === 'skipped') {
|
|
220
|
+
process.stdout.write(` - skipped: ${outcome.reason ?? ''}\n`);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
changed += 1;
|
|
224
|
+
process.stdout.write(` ${outcome.action === 'written' ? 'updated' : 'would update'} ${outcome.path}\n`);
|
|
225
|
+
if (outcome.backupPath !== undefined) {
|
|
226
|
+
backedUp += 1;
|
|
227
|
+
process.stdout.write(` backup: ${outcome.backupPath}\n`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (!options.dryRun && !options.remove) {
|
|
231
|
+
process.stdout.write(` ${state.harness.reloadHint}\n`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
process.stdout.write(changed === 0
|
|
235
|
+
? '\nNo changes were needed.\n'
|
|
236
|
+
: `\n${String(changed)} file(s) ${options.dryRun ? 'would be ' : ''}updated.\n`);
|
|
237
|
+
if (backedUp > 0) {
|
|
238
|
+
process.stdout.write('\nThe backups listed above are complete copies of the previous configuration,\n' +
|
|
239
|
+
"so they can contain other servers' credentials. Nothing prunes them: delete\n" +
|
|
240
|
+
'them yourself once the new configuration is working.\n');
|
|
241
|
+
}
|
|
242
|
+
if (!options.remove && !options.dryRun) {
|
|
243
|
+
process.stdout.write('\nCredentials are optional: 13 of 17 tools work without any. Configure them only\n' +
|
|
244
|
+
'when you want to call the gateway — see docs/mcp/CONFIGURATION.md.\n');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* True when this file was started as a script rather than imported.
|
|
249
|
+
*
|
|
250
|
+
* `npm run deploy` runs it directly; the tests import it to exercise the file
|
|
251
|
+
* transforms, and a bare `main()` at module scope would rewrite the developer's
|
|
252
|
+
* own harness configuration the moment the suite loaded the module. Both sides
|
|
253
|
+
* are resolved through `realpathSync` so a symlinked bin shim, and Windows'
|
|
254
|
+
* indifference to path casing, still compare equal.
|
|
255
|
+
*/
|
|
256
|
+
function invokedAsScript() {
|
|
257
|
+
const entry = process.argv[1];
|
|
258
|
+
if (entry === undefined) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
try {
|
|
262
|
+
return realpathSync.native(entry) === realpathSync.native(fileURLToPath(import.meta.url));
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (invokedAsScript()) {
|
|
269
|
+
main().catch((error) => {
|
|
270
|
+
process.stderr.write(`\ndeploy failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
271
|
+
process.exit(1);
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/install/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harness registration.
|
|
3
|
+
*
|
|
4
|
+
* Each supported AI harness stores MCP server definitions in its own place and
|
|
5
|
+
* its own format. The transforms below are pure so they can be unit-tested
|
|
6
|
+
* without touching a real configuration file, and every one of them preserves
|
|
7
|
+
* unrelated content: these files hold the user's other servers and settings, and
|
|
8
|
+
* a deploy script that clobbers them would be worse than no deploy script.
|
|
9
|
+
*
|
|
10
|
+
* That guarantee extends to this server's own entry. Re-registering updates the
|
|
11
|
+
* `command` and `args` and nothing else, because the surrounding `env` block is
|
|
12
|
+
* where the harness passes the merchant's JAZZCASH_* credentials in — a
|
|
13
|
+
* re-deploy that dropped it would silently deconfigure the gateway tools.
|
|
14
|
+
*/
|
|
15
|
+
export declare const HARNESS_IDS: readonly ["claude", "codex", "antigravity"];
|
|
16
|
+
export type HarnessId = (typeof HARNESS_IDS)[number];
|
|
17
|
+
/** A stdio MCP server definition. */
|
|
18
|
+
export interface ServerEntry {
|
|
19
|
+
readonly command: string;
|
|
20
|
+
readonly args: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
export type ConfigFormat = 'json' | 'toml';
|
|
23
|
+
export interface HarnessDescriptor {
|
|
24
|
+
readonly id: HarnessId;
|
|
25
|
+
readonly label: string;
|
|
26
|
+
readonly format: ConfigFormat;
|
|
27
|
+
/**
|
|
28
|
+
* Candidate configuration paths, most canonical first.
|
|
29
|
+
*
|
|
30
|
+
* Several harnesses keep more than one; writing to all that already exist is
|
|
31
|
+
* more reliable than guessing which the installed build reads.
|
|
32
|
+
*/
|
|
33
|
+
configPaths(home?: string): readonly string[];
|
|
34
|
+
/**
|
|
35
|
+
* Whether a missing file should be created.
|
|
36
|
+
*
|
|
37
|
+
* True where the file is the documented location and its absence just means
|
|
38
|
+
* the user has never added a server.
|
|
39
|
+
*/
|
|
40
|
+
readonly createIfMissing: boolean;
|
|
41
|
+
/** How the harness is told to reload. Shown after a successful write. */
|
|
42
|
+
readonly reloadHint: string;
|
|
43
|
+
}
|
|
44
|
+
export declare const HARNESSES: readonly HarnessDescriptor[];
|
|
45
|
+
export declare function findHarness(id: string): HarnessDescriptor | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Add, update or remove a server in a `{ "mcpServers": { … } }` document.
|
|
48
|
+
*
|
|
49
|
+
* An existing entry is merged, not replaced: only `command` and `args` are
|
|
50
|
+
* rewritten, so an `env` block and any other key the harness understands survive
|
|
51
|
+
* a re-deploy. Unrelated keys and unrelated servers are preserved exactly. An
|
|
52
|
+
* empty or whitespace-only document is treated as `{}` so a fresh file can be
|
|
53
|
+
* created.
|
|
54
|
+
*/
|
|
55
|
+
export declare function upsertJsonMcpServer(contents: string, name: string, entry: ServerEntry | undefined): string;
|
|
56
|
+
/** Read the current definition of one server from a JSON document, if present. */
|
|
57
|
+
export declare function readJsonMcpServer(contents: string, name: string): unknown;
|
|
58
|
+
/**
|
|
59
|
+
* Add, update or remove `[mcp_servers.<name>]` in a TOML document.
|
|
60
|
+
*
|
|
61
|
+
* The table and any sub-tables (such as an `.env` block) are lifted out, each
|
|
62
|
+
* stopping at the next table header so neighbouring servers survive. An update
|
|
63
|
+
* puts back everything it lifted apart from `command` and `args`, so the
|
|
64
|
+
* merchant's credentials outlive a re-deploy; a removal keeps none of it.
|
|
65
|
+
*
|
|
66
|
+
* Only the lifted table is rewritten. The rest of the document is passed through
|
|
67
|
+
* line for line — deliberately, since a blank line inside a `"""…"""` value is
|
|
68
|
+
* content, and the table's own trailing blank lines leave with it, so there is
|
|
69
|
+
* nothing left to tidy up afterwards.
|
|
70
|
+
*/
|
|
71
|
+
export declare function upsertTomlMcpServer(contents: string, name: string, entry: ServerEntry | undefined): string;
|
|
72
|
+
/** True when the TOML document already declares this server. */
|
|
73
|
+
export declare function tomlHasMcpServer(contents: string, name: string): boolean;
|
|
74
|
+
//# sourceMappingURL=harnesses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnesses.d.ts","sourceRoot":"","sources":["../../src/install/harnesses.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,WAAW,6CAA8C,CAAC;AAEvE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,iBAAiB,EA4BjD,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAErE;AAaD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAgC1G;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAczE;AA8FD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAqD1G;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAExE"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Harness registration.
|
|
5
|
+
*
|
|
6
|
+
* Each supported AI harness stores MCP server definitions in its own place and
|
|
7
|
+
* its own format. The transforms below are pure so they can be unit-tested
|
|
8
|
+
* without touching a real configuration file, and every one of them preserves
|
|
9
|
+
* unrelated content: these files hold the user's other servers and settings, and
|
|
10
|
+
* a deploy script that clobbers them would be worse than no deploy script.
|
|
11
|
+
*
|
|
12
|
+
* That guarantee extends to this server's own entry. Re-registering updates the
|
|
13
|
+
* `command` and `args` and nothing else, because the surrounding `env` block is
|
|
14
|
+
* where the harness passes the merchant's JAZZCASH_* credentials in — a
|
|
15
|
+
* re-deploy that dropped it would silently deconfigure the gateway tools.
|
|
16
|
+
*/
|
|
17
|
+
export const HARNESS_IDS = ['claude', 'codex', 'antigravity'];
|
|
18
|
+
export const HARNESSES = [
|
|
19
|
+
{
|
|
20
|
+
id: 'claude',
|
|
21
|
+
label: 'Claude Code',
|
|
22
|
+
format: 'json',
|
|
23
|
+
configPaths: (home = homedir()) => [join(home, '.claude.json')],
|
|
24
|
+
createIfMissing: false,
|
|
25
|
+
reloadHint: 'Restart Claude Code, or run /mcp to check the connection.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'codex',
|
|
29
|
+
label: 'OpenAI Codex',
|
|
30
|
+
format: 'toml',
|
|
31
|
+
configPaths: (home = homedir()) => [join(home, '.codex', 'config.toml')],
|
|
32
|
+
createIfMissing: true,
|
|
33
|
+
reloadHint: 'Restart Codex. Verify with /mcp inside the CLI.',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'antigravity',
|
|
37
|
+
label: 'Antigravity',
|
|
38
|
+
format: 'json',
|
|
39
|
+
configPaths: (home = homedir()) => [
|
|
40
|
+
join(home, '.gemini', 'antigravity', 'mcp_config.json'),
|
|
41
|
+
join(home, '.gemini', 'mcp_config.json'),
|
|
42
|
+
],
|
|
43
|
+
createIfMissing: true,
|
|
44
|
+
reloadHint: 'Restart Antigravity, or reload the MCP servers from its settings panel.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
export function findHarness(id) {
|
|
48
|
+
return HARNESSES.find((harness) => harness.id === id);
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// JSON transforms
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/** A shallow copy of a plain JSON object, or an empty one for anything else. */
|
|
54
|
+
function asRecord(value) {
|
|
55
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
56
|
+
? { ...value }
|
|
57
|
+
: {};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Add, update or remove a server in a `{ "mcpServers": { … } }` document.
|
|
61
|
+
*
|
|
62
|
+
* An existing entry is merged, not replaced: only `command` and `args` are
|
|
63
|
+
* rewritten, so an `env` block and any other key the harness understands survive
|
|
64
|
+
* a re-deploy. Unrelated keys and unrelated servers are preserved exactly. An
|
|
65
|
+
* empty or whitespace-only document is treated as `{}` so a fresh file can be
|
|
66
|
+
* created.
|
|
67
|
+
*/
|
|
68
|
+
export function upsertJsonMcpServer(contents, name, entry) {
|
|
69
|
+
const trimmed = contents.trim();
|
|
70
|
+
let document;
|
|
71
|
+
if (trimmed === '') {
|
|
72
|
+
document = {};
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const parsed = JSON.parse(trimmed);
|
|
76
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
77
|
+
throw new Error('Expected the configuration file to contain a JSON object.');
|
|
78
|
+
}
|
|
79
|
+
document = { ...parsed };
|
|
80
|
+
}
|
|
81
|
+
const servers = asRecord(document['mcpServers']);
|
|
82
|
+
if (entry === undefined) {
|
|
83
|
+
// Removing a server that was never there is a no-op, not an error: `deploy
|
|
84
|
+
// --remove` should be safe to run twice. Handing back the untouched text
|
|
85
|
+
// rather than a re-serialised `{"mcpServers":{}}` also stops `--remove`
|
|
86
|
+
// creating a configuration file the user never had, matching the TOML side.
|
|
87
|
+
if (!Object.hasOwn(servers, name)) {
|
|
88
|
+
return contents;
|
|
89
|
+
}
|
|
90
|
+
delete servers[name];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
servers[name] = { ...asRecord(servers[name]), command: entry.command, args: [...entry.args] };
|
|
94
|
+
}
|
|
95
|
+
document['mcpServers'] = servers;
|
|
96
|
+
return `${JSON.stringify(document, null, 2)}\n`;
|
|
97
|
+
}
|
|
98
|
+
/** Read the current definition of one server from a JSON document, if present. */
|
|
99
|
+
export function readJsonMcpServer(contents, name) {
|
|
100
|
+
const trimmed = contents.trim();
|
|
101
|
+
if (trimmed === '') {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
const parsed = JSON.parse(trimmed);
|
|
105
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
const servers = parsed['mcpServers'];
|
|
109
|
+
if (typeof servers !== 'object' || servers === null) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
return servers[name];
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// TOML transforms
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
/**
|
|
118
|
+
* Quote a TOML value.
|
|
119
|
+
*
|
|
120
|
+
* Literal single-quoted strings need no escaping, which keeps Windows paths
|
|
121
|
+
* readable. A value containing a quote falls back to a basic string, for which
|
|
122
|
+
* JSON escaping is compatible with TOML.
|
|
123
|
+
*/
|
|
124
|
+
function tomlString(value) {
|
|
125
|
+
return value.includes("'") ? JSON.stringify(value) : `'${value}'`;
|
|
126
|
+
}
|
|
127
|
+
function tomlArray(values) {
|
|
128
|
+
return `[${values.map(tomlString).join(', ')}]`;
|
|
129
|
+
}
|
|
130
|
+
/** A bare key where the name allows one, quoted where it does not. */
|
|
131
|
+
function tomlKey(name) {
|
|
132
|
+
return /^[A-Za-z0-9_-]+$/.test(name) ? name : JSON.stringify(name);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Split a dotted TOML key into its segments, unquoting each one.
|
|
136
|
+
*
|
|
137
|
+
* `[mcp_servers.m-mcp]` and `[mcp_servers."m-mcp"]` name the same table.
|
|
138
|
+
* Comparing the raw text would miss the quoted spelling — which a hand edit or
|
|
139
|
+
* another tool may well have written — and append a second table for a key that
|
|
140
|
+
* already exists, leaving the user with a config no harness can parse.
|
|
141
|
+
*/
|
|
142
|
+
function tomlKeySegments(key) {
|
|
143
|
+
const segments = [];
|
|
144
|
+
let current = '';
|
|
145
|
+
let quote;
|
|
146
|
+
for (const character of key) {
|
|
147
|
+
if (quote !== undefined) {
|
|
148
|
+
if (character === quote) {
|
|
149
|
+
quote = undefined;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
current += character;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (character === '"' || character === "'") {
|
|
156
|
+
quote = character;
|
|
157
|
+
}
|
|
158
|
+
else if (character === '.') {
|
|
159
|
+
segments.push(current.trim());
|
|
160
|
+
current = '';
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
current += character;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
segments.push(current.trim());
|
|
167
|
+
return segments;
|
|
168
|
+
}
|
|
169
|
+
/** How a line relates to `mcp_servers.<name>`: its own table, a sub-table, or neither. */
|
|
170
|
+
function ownedTableKind(line, name) {
|
|
171
|
+
const match = /^\s*\[([^\]]+)\]\s*$/.exec(line);
|
|
172
|
+
if (match === null) {
|
|
173
|
+
return 'none';
|
|
174
|
+
}
|
|
175
|
+
const segments = tomlKeySegments(match[1] ?? '');
|
|
176
|
+
if (segments[0] !== 'mcp_servers' || segments[1] !== name) {
|
|
177
|
+
return 'none';
|
|
178
|
+
}
|
|
179
|
+
return segments.length === 2 ? 'root' : 'sub';
|
|
180
|
+
}
|
|
181
|
+
function isTableHeader(line) {
|
|
182
|
+
return /^\s*\[/.test(line);
|
|
183
|
+
}
|
|
184
|
+
/** True when a line assigns one of the two keys this module owns. */
|
|
185
|
+
function isManagedKey(line) {
|
|
186
|
+
return /^\s*["']?(?:command|args)["']?\s*=/.test(line);
|
|
187
|
+
}
|
|
188
|
+
/** Drop the blank lines at both ends of a captured block. */
|
|
189
|
+
function trimBlankEdges(lines) {
|
|
190
|
+
const trimmed = [...lines];
|
|
191
|
+
while (trimmed.length > 0 && (trimmed[0] ?? '').trim() === '') {
|
|
192
|
+
trimmed.shift();
|
|
193
|
+
}
|
|
194
|
+
while (trimmed.length > 0 && (trimmed.at(-1) ?? '').trim() === '') {
|
|
195
|
+
trimmed.pop();
|
|
196
|
+
}
|
|
197
|
+
return trimmed;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Add, update or remove `[mcp_servers.<name>]` in a TOML document.
|
|
201
|
+
*
|
|
202
|
+
* The table and any sub-tables (such as an `.env` block) are lifted out, each
|
|
203
|
+
* stopping at the next table header so neighbouring servers survive. An update
|
|
204
|
+
* puts back everything it lifted apart from `command` and `args`, so the
|
|
205
|
+
* merchant's credentials outlive a re-deploy; a removal keeps none of it.
|
|
206
|
+
*
|
|
207
|
+
* Only the lifted table is rewritten. The rest of the document is passed through
|
|
208
|
+
* line for line — deliberately, since a blank line inside a `"""…"""` value is
|
|
209
|
+
* content, and the table's own trailing blank lines leave with it, so there is
|
|
210
|
+
* nothing left to tidy up afterwards.
|
|
211
|
+
*/
|
|
212
|
+
export function upsertTomlMcpServer(contents, name, entry) {
|
|
213
|
+
const lines = contents.split(/\r?\n/);
|
|
214
|
+
const kept = [];
|
|
215
|
+
const carriedKeys = [];
|
|
216
|
+
const subTables = [];
|
|
217
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
218
|
+
const line = lines[index] ?? '';
|
|
219
|
+
const kind = ownedTableKind(line, name);
|
|
220
|
+
if (kind === 'none') {
|
|
221
|
+
kept.push(line);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// Take the table's body: everything up to the next table header.
|
|
225
|
+
const tableBody = [];
|
|
226
|
+
index += 1;
|
|
227
|
+
while (index < lines.length) {
|
|
228
|
+
const bodyLine = lines[index] ?? '';
|
|
229
|
+
if (isTableHeader(bodyLine)) {
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
tableBody.push(bodyLine);
|
|
233
|
+
index += 1;
|
|
234
|
+
}
|
|
235
|
+
index -= 1;
|
|
236
|
+
if (kind === 'root') {
|
|
237
|
+
carriedKeys.push(...trimBlankEdges(tableBody.filter((bodyLine) => !isManagedKey(bodyLine))));
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
subTables.push([line.trim(), ...trimBlankEdges(tableBody)]);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const body = kept.join('\n').replace(/\s+$/, '');
|
|
244
|
+
if (entry === undefined) {
|
|
245
|
+
return body === '' ? '' : `${body}\n`;
|
|
246
|
+
}
|
|
247
|
+
const block = [
|
|
248
|
+
`[mcp_servers.${tomlKey(name)}]`,
|
|
249
|
+
`command = ${tomlString(entry.command)}`,
|
|
250
|
+
`args = ${tomlArray(entry.args)}`,
|
|
251
|
+
...carriedKeys,
|
|
252
|
+
];
|
|
253
|
+
for (const subTable of subTables) {
|
|
254
|
+
block.push('', ...subTable);
|
|
255
|
+
}
|
|
256
|
+
const rendered = block.join('\n');
|
|
257
|
+
return body === '' ? `${rendered}\n` : `${body}\n\n${rendered}\n`;
|
|
258
|
+
}
|
|
259
|
+
/** True when the TOML document already declares this server. */
|
|
260
|
+
export function tomlHasMcpServer(contents, name) {
|
|
261
|
+
return contents.split(/\r?\n/).some((line) => ownedTableKind(line, name) !== 'none');
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=harnesses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/install/harnesses.ts"],"names":[],"mappings":"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"}
|