@crediolabs/policy-builder-mcp 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/src/schemas.d.ts +45 -346
- package/dist/src/schemas.js +21 -38
- package/dist/src/server.js +5 -6
- package/dist/src/transports/http.js +32 -34
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/src/index.d.ts +7 -0
- package/dist-cjs/src/index.js +20 -0
- package/dist-cjs/src/schemas.d.ts +871 -0
- package/dist-cjs/src/schemas.js +121 -0
- package/dist-cjs/src/server.d.ts +6 -0
- package/dist-cjs/src/server.js +42 -0
- package/dist-cjs/src/tools/result.d.ts +24 -0
- package/dist-cjs/src/tools/result.js +38 -0
- package/dist-cjs/src/transports/http.d.ts +21 -0
- package/dist-cjs/src/transports/http.js +181 -0
- package/dist-cjs/src/transports/stdio.d.ts +1 -0
- package/dist-cjs/src/transports/stdio.js +18 -0
- package/package.json +11 -7
- package/src/schemas.ts +19 -50
- package/src/server.ts +5 -14
- package/src/transports/http.ts +32 -35
package/dist/src/schemas.js
CHANGED
|
@@ -20,14 +20,14 @@
|
|
|
20
20
|
// `ZodEffects`, which has no `.shape`). They MUST stay in lockstep with
|
|
21
21
|
// the strict schemas - a drift in field type or optionality breaks the
|
|
22
22
|
// SDK's emitted JSON Schema.
|
|
23
|
-
import { ComposeUserResponsesSchema, GetInterpreterInfoInputSchema, InstallPolicyInputSchema, InterpreterOptionsSchema,
|
|
23
|
+
import { ComposeUserResponsesSchema, GetInterpreterInfoInputSchema, InstallPolicyInputSchema, InterpreterOptionsSchema, NetworkSchema, PredicateNodeSchema, RecordedTransactionSchema, RecordTransactionInputSchema, RevokePolicyInputSchema, SynthesizePolicyInputSchema, ToolErrorSchema, } from '@crediolabs/policy-synth/run';
|
|
24
24
|
import { z } from 'zod';
|
|
25
25
|
// Re-export the strict schemas so MCP package consumers (and existing tests)
|
|
26
26
|
// still get them from this module. The canonical home is
|
|
27
27
|
// `@crediolabs/policy-synth/run`; the re-exports here are a shim kept for
|
|
28
28
|
// backward compatibility with downstream callers that imported from the MCP
|
|
29
29
|
// package directly.
|
|
30
|
-
export { ComposeUserResponsesSchema, GetInterpreterInfoInputSchema, InstallPolicyInputSchema, InterpreterOptionsSchema,
|
|
30
|
+
export { ComposeUserResponsesSchema, GetInterpreterInfoInputSchema, InstallPolicyInputSchema, InterpreterOptionsSchema, NetworkSchema, PredicateNodeSchema, RecordedTransactionSchema, RecordTransactionInputSchema, RevokePolicyInputSchema, SynthesizePolicyInputSchema, ToolErrorSchema, };
|
|
31
31
|
/** Flat ZodRawShape used for the MCP SDK tool registration. The body
|
|
32
32
|
* re-validates against `RecordTransactionInputSchema` so the mutual-exclusion
|
|
33
33
|
* rule still fires (the SDK does not invoke `.refine()` at registration time). */
|
|
@@ -38,17 +38,15 @@ export const RecordTransactionToolShape = {
|
|
|
38
38
|
confidenceOverride: z.number().min(0).max(1).optional(),
|
|
39
39
|
};
|
|
40
40
|
/** Flat ZodRawShape used for MCP tool registration. Every field is optional
|
|
41
|
-
* so the JSON-Schema the SDK exposes to clients
|
|
42
|
-
*
|
|
41
|
+
* so the JSON-Schema the SDK exposes to clients stays permissive; the body
|
|
42
|
+
* re-validates against the strict schema. */
|
|
43
43
|
export const SynthesizePolicyToolShape = {
|
|
44
|
-
source: z.
|
|
45
|
-
mandate: MandateSpecSchema.optional(),
|
|
44
|
+
source: z.literal('recording').optional(),
|
|
46
45
|
recordedTx: RecordedTransactionSchema.optional(),
|
|
47
46
|
network: NetworkSchema.optional(),
|
|
48
47
|
userResponses: ComposeUserResponsesSchema.optional(),
|
|
49
48
|
confidenceOverride: z.object({ threshold: z.number().min(0).max(1) }).optional(),
|
|
50
49
|
interpreter: InterpreterOptionsSchema.optional(),
|
|
51
|
-
ozConfig: OzAdapterConfigSchema.optional(),
|
|
52
50
|
// Without this the tool chain has no join. A ProposedPolicy carries
|
|
53
51
|
// `policyDocuments[].encodedPredicate` (canonical ScVal bytes), while
|
|
54
52
|
// `simulate_policy` and `verify_policy` both want the PredicateNode TREE,
|
|
@@ -58,38 +56,31 @@ export const SynthesizePolicyToolShape = {
|
|
|
58
56
|
// which skips the interpreter predicate entirely.
|
|
59
57
|
explain: z.boolean().optional(),
|
|
60
58
|
};
|
|
61
|
-
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
* malformed predicate. `predicate` is nullable here (vs required for
|
|
67
|
-
* verify_policy) so the SDK-emitted JSON Schema mirrors the engine's
|
|
68
|
-
* "OZ-only / no interpreter predicate" contract. */
|
|
69
|
-
export const SimulatePolicyToolShape = {
|
|
70
|
-
predicate: z.unknown().nullable().optional(),
|
|
59
|
+
/** `simulate_policy` and `verify_policy` share their input: the predicate tree
|
|
60
|
+
* (from `synthesize_policy` under `explain`) plus the recording it was
|
|
61
|
+
* synthesised from. */
|
|
62
|
+
const PolicyCheckToolShape = {
|
|
63
|
+
predicate: PredicateNodeSchema,
|
|
71
64
|
permitTx: RecordedTransactionSchema,
|
|
72
65
|
validUntilLedger: z.number().int().positive().optional(),
|
|
73
|
-
oraclePricesByAsset: z.record(z.string(), OraclePriceFixtureSchema).optional(),
|
|
74
|
-
};
|
|
75
|
-
/** Flat ZodRawShape for `verify_policy`. Same `z.unknown()` boundary
|
|
76
|
-
* trick for `predicate` as `SimulatePolicyToolShape`; `predicate` is
|
|
77
|
-
* required at the strict-schema level (`VerifyPolicyInputSchema`) so
|
|
78
|
-
* the body fails closed on a missing predicate. */
|
|
79
|
-
export const VerifyPolicyToolShape = {
|
|
80
|
-
predicate: z.unknown(),
|
|
81
|
-
permitTx: RecordedTransactionSchema,
|
|
82
|
-
validUntilLedger: z.number().int().positive().optional(),
|
|
83
|
-
oraclePricesByAsset: z.record(z.string(), OraclePriceFixtureSchema).optional(),
|
|
84
66
|
};
|
|
67
|
+
export const SimulatePolicyToolShape = { ...PolicyCheckToolShape };
|
|
68
|
+
export const VerifyPolicyToolShape = { ...PolicyCheckToolShape };
|
|
85
69
|
/** Common base for `install_policy` and `revoke_policy`: smartAccount,
|
|
86
|
-
* sourceAccount, optional RPC URL, optional base fee. Both
|
|
87
|
-
* same smart-account context, so the SDK-emitted JSON Schema stays
|
|
70
|
+
* sourceAccount, target network, optional RPC URL, optional base fee. Both
|
|
71
|
+
* share the same smart-account context, so the SDK-emitted JSON Schema stays
|
|
88
72
|
* identical for those fields. The body re-validates against the strict
|
|
89
73
|
* schemas in `@crediolabs/policy-synth/run`. */
|
|
90
74
|
const SmartAccountToolShape = {
|
|
91
75
|
smartAccount: z.string().min(1).optional(),
|
|
92
76
|
sourceAccount: z.string().min(1).optional(),
|
|
77
|
+
/** Omitting this from the shape made both tools testnet-ONLY. The input
|
|
78
|
+
* schema defaults `network` to `testnet` and expects a mainnet caller to
|
|
79
|
+
* set it, but a field absent from the tool shape is STRIPPED before the
|
|
80
|
+
* body runs, so an MCP client could not reach the mainnet pin at all. The
|
|
81
|
+
* failure presented as a deliberate testnet pin rather than as a missing
|
|
82
|
+
* parameter, which sent integrators to build the install by hand. */
|
|
83
|
+
network: NetworkSchema.optional(),
|
|
93
84
|
rpcUrl: z.string().url().optional(),
|
|
94
85
|
baseFee: z.number().int().positive().optional(),
|
|
95
86
|
};
|
|
@@ -112,14 +103,6 @@ export const RevokePolicyToolShape = {
|
|
|
112
103
|
ruleId: z.number().int().nonnegative().optional(),
|
|
113
104
|
interpreterAddress: z.string().optional(),
|
|
114
105
|
};
|
|
115
|
-
/** Flat ZodRawShape for `merge_policy`: the tightening remedy when two rules
|
|
116
|
-
* our interpreter polices can serve the same calls. Two steps, in order. */
|
|
117
|
-
export const MergePolicyToolShape = {
|
|
118
|
-
...SmartAccountToolShape,
|
|
119
|
-
ruleId: z.number().int().nonnegative(),
|
|
120
|
-
incomingPredicateBlobBase64: z.string().min(1),
|
|
121
|
-
step: z.enum(['detach', 'reinstall']),
|
|
122
|
-
};
|
|
123
106
|
/** Flat ZodRawShape for `get_interpreter_info`. `verifyLive` triggers an
|
|
124
107
|
* optional RPC `grammar_version()` call so the caller can verify the
|
|
125
108
|
* deployed contract matches the pin. */
|
package/dist/src/server.js
CHANGED
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
// Stateless: a fresh McpServer is constructed per transport (stdio/HTTP). No
|
|
11
11
|
// shared mutable state across calls; nothing here caches, queues, or holds
|
|
12
12
|
// key material.
|
|
13
|
-
import { runGetInterpreterInfo, runInstallPolicy,
|
|
13
|
+
import { runGetInterpreterInfo, runInstallPolicy, runRecordTransaction, runRevokePolicy, runSimulatePolicy, runSynthesizePolicy, runVerifyPolicy, } from '@crediolabs/policy-synth/run';
|
|
14
14
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
15
|
-
import { GetInterpreterInfoToolShape, InstallPolicyToolShape,
|
|
15
|
+
import { GetInterpreterInfoToolShape, InstallPolicyToolShape, RecordTransactionToolShape, RevokePolicyToolShape, SimulatePolicyToolShape, SynthesizePolicyToolShape, VerifyPolicyToolShape, } from "./schemas.js";
|
|
16
16
|
import { mcpResultFromCore } from "./tools/result.js";
|
|
17
17
|
/** Our envelope types `structuredContent` precisely (T / ToolError); the SDK's
|
|
18
18
|
* CallToolResult widens it to Record<string, unknown>, so the nominal types
|
|
@@ -29,11 +29,10 @@ export function createMcpServer() {
|
|
|
29
29
|
/** Idempotent registration of the T1 tool set on the given server. */
|
|
30
30
|
export function registerTools(server) {
|
|
31
31
|
server.tool('record_transaction', 'Decode a Soroban transaction (on-chain hash OR base64 envelope XDR) into a RecordedTransaction. Returns a machine-readable ToolError on validation failure.', RecordTransactionToolShape, (args) => runRecordTransaction(args).then(toCallToolResult));
|
|
32
|
-
server.tool('synthesize_policy', 'Synthesize a ProposedPolicy from
|
|
33
|
-
server.tool('simulate_policy', '
|
|
34
|
-
server.tool('verify_policy', '
|
|
32
|
+
server.tool('synthesize_policy', 'Synthesize a ProposedPolicy from a RecordedTransaction (`source: recording`).', SynthesizePolicyToolShape, (args) => runSynthesizePolicy(args).then(toCallToolResult));
|
|
33
|
+
server.tool('simulate_policy', 'Evaluate a predicate against one recorded call and report permit/deny with the deny reason. The evaluator is a second implementation of the on-chain semantics, cross-checked against the Rust interpreter by the conformance harness, so a verdict here is a claim about what the contract would do. Pass the `predicate` returned by `synthesize_policy` under `explain`.', SimulatePolicyToolShape, (args) => toCallToolResult(runSimulatePolicy(args)));
|
|
34
|
+
server.tool('verify_policy', 'Check a predicate against the transaction it was synthesised from, plus a generated deny case per dimension. Reports `ok` only when the permit case is permitted AND every deny case is denied - a denied permit case means the policy is too strict, a permitted deny case means it is too loose.', VerifyPolicyToolShape, (args) => toCallToolResult(runVerifyPolicy(args)));
|
|
35
35
|
server.tool('install_policy', 'Build an UNSIGNED Soroban transaction XDR for `account.add_context_rule(...)` that installs a new policy rule on the given smart account. The wallet signs the returned XDR - the signature IS the user-confirmation step (this server is stateless and holds no key material, so there is no two-call confirm pair). Only CALL 1 is emitted; the interpreter `install` follow-up needs the rule id the account assigns in call 1 and is documented in `followUp` in the response.', InstallPolicyToolShape, (args) => runInstallPolicy(args).then(toCallToolResult));
|
|
36
36
|
server.tool('revoke_policy', 'Build an UNSIGNED Soroban transaction XDR for `account.remove_context_rule(ruleId)` that removes a policy rule from the given smart account. The smart account handles uninstalling each attached policy itself. Auth is master-only - the source account MUST be the master signer set; delegated signers cannot uninstall.', RevokePolicyToolShape, (args) => runRevokePolicy(args).then(toCallToolResult));
|
|
37
|
-
server.tool('merge_policy', "Tighten a rule by replacing its predicate with the conjunction of the installed one and a new one. This is the remedy for the overlap `install_policy` reports between two rules the interpreter polices: because OpenZeppelin enforces only the rule a signer names, adding a second, tighter rule restricts nothing, so the restriction has to become one predicate. TWO transactions, in order: call with step 'detach' to remove the current attachment, wait for it to confirm, then call with step 'reinstall'. Detaching uninstalls the policy, which RESETS every counter on the rule, and the rule is unpoliced in between - both are reported in `warnings`.", MergePolicyToolShape, (args) => runMergePolicy(args).then(toCallToolResult));
|
|
38
37
|
server.tool('get_interpreter_info', 'Read-only fingerprint lookup for the policy interpreter contract: returns the pinned address, grammar version, and wasm sha256 (from the pinned constants + SELF_VERSION). When `verifyLive=true`, performs an additional `grammar_version()` RPC call against the pinned address and reports whether the deployed contract matches the pin - a live mismatch check is more useful than a fabricated audit field.', GetInterpreterInfoToolShape, (args) => runGetInterpreterInfo(args).then(toCallToolResult));
|
|
39
38
|
}
|
|
@@ -2,13 +2,10 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Streamable HTTP transport (hosted). Uses the Node http module directly so
|
|
4
4
|
// the package stays thin - no express / hono dep. We run in STATELESS mode
|
|
5
|
-
// (no
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// a transport inside the request handler, connect it, dispatch the request,
|
|
10
|
-
// then close it (close() resets the McpServer's transport slot so the next
|
|
11
|
-
// request can reconnect cleanly).
|
|
5
|
+
// (no sessionIdGenerator: the SDK disables session management when it is not
|
|
6
|
+
// provided) so each POST /mcp is its own transaction: this matches the
|
|
7
|
+
// brief's "stateless across calls" invariant. Stateless means a fresh server
|
|
8
|
+
// and transport per request - see the handler for why the SDK requires it.
|
|
12
9
|
//
|
|
13
10
|
// Single endpoint: POST /mcp (the SDK also accepts GET for SSE streaming, but
|
|
14
11
|
// the T1 surface does not emit server-initiated messages so we omit it).
|
|
@@ -39,11 +36,6 @@ export async function startHttpServer(opts) {
|
|
|
39
36
|
if (!LOOPBACK_HOSTS.has(host) && opts.allowExternalHost !== true) {
|
|
40
37
|
throw new Error(`startHttpServer: refusing to bind host ${host}: the MCP surface is unauthenticated, so only loopback (127.0.0.1, ::1, localhost) is permitted by default. Pass \`allowExternalHost: true\` to opt in to a non-loopback bind.`);
|
|
41
38
|
}
|
|
42
|
-
// The McpServer is stateless and per-process; we keep ONE instance alive
|
|
43
|
-
// for the lifetime of the listener, but each request creates + connects a
|
|
44
|
-
// fresh StreamableHTTPServerTransport (SDK 1.26+ refuses to reuse a
|
|
45
|
-
// stateless transport across requests).
|
|
46
|
-
const server = createMcpServer();
|
|
47
39
|
const httpServer = createServer(async (req, res) => {
|
|
48
40
|
if (!req.url) {
|
|
49
41
|
sendJson(res, 400, { error: 'missing url' });
|
|
@@ -89,21 +81,33 @@ export async function startHttpServer(opts) {
|
|
|
89
81
|
});
|
|
90
82
|
return;
|
|
91
83
|
}
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
|
|
84
|
+
// A stateless transport handles exactly ONE request: the SDK refuses to
|
|
85
|
+
// reuse one ("Stateless transport cannot be reused across requests"),
|
|
86
|
+
// because a shared instance would let concurrent clients collide on
|
|
87
|
+
// JSON-RPC message ids. So the server and its transport are built here,
|
|
88
|
+
// per request, and torn down when the response closes.
|
|
89
|
+
// No `sessionIdGenerator`: the SDK disables session management when the
|
|
90
|
+
// option is absent, which is the stateless mode this surface wants.
|
|
91
|
+
// Passing an explicit `undefined` means the same thing to the SDK but is
|
|
92
|
+
// not assignable under `exactOptionalPropertyTypes`, so omission is both
|
|
93
|
+
// the type-correct and the documented spelling.
|
|
94
|
+
const server = createMcpServer();
|
|
103
95
|
const transport = new StreamableHTTPServerTransport();
|
|
104
|
-
|
|
105
|
-
|
|
96
|
+
// Registered before dispatch, not after: once the response has closed the
|
|
97
|
+
// event is gone, so a listener attached afterwards would never fire and
|
|
98
|
+
// the pair would leak.
|
|
99
|
+
res.on('close', () => {
|
|
100
|
+
void transport.close().catch(() => { });
|
|
101
|
+
void server.close().catch(() => { });
|
|
102
|
+
});
|
|
106
103
|
try {
|
|
104
|
+
// The SDK declares `Transport.onclose` as an optional `() => void`, but
|
|
105
|
+
// exposes it on this class as an accessor pair typed `(() => void) |
|
|
106
|
+
// undefined`. Those are not assignable under `exactOptionalPropertyTypes`.
|
|
107
|
+
// The widening is upstream and structural only - the runtime object does
|
|
108
|
+
// satisfy `Transport` - so the assertion is narrowed to this one call
|
|
109
|
+
// rather than relaxing the compiler flag for the whole package.
|
|
110
|
+
await server.connect(transport);
|
|
107
111
|
// `handleRequest` writes the response and returns once the message has
|
|
108
112
|
// been dispatched. No shared state across calls in stateless mode.
|
|
109
113
|
await transport.handleRequest(req, res, body);
|
|
@@ -124,14 +128,6 @@ export async function startHttpServer(opts) {
|
|
|
124
128
|
sendJson(res, 500, { error });
|
|
125
129
|
}
|
|
126
130
|
}
|
|
127
|
-
finally {
|
|
128
|
-
// Closing the transport fires its `onclose`, which resets
|
|
129
|
-
// `server._transport` to undefined so the next request can connect
|
|
130
|
-
// a fresh transport. We swallow the close error: a request that
|
|
131
|
-
// already wrote its response does not care whether the close path
|
|
132
|
-
// threw.
|
|
133
|
-
await transport.close().catch(() => { });
|
|
134
|
-
}
|
|
135
131
|
});
|
|
136
132
|
await new Promise((resolve, reject) => {
|
|
137
133
|
httpServer.once('error', reject);
|
|
@@ -144,9 +140,11 @@ export async function startHttpServer(opts) {
|
|
|
144
140
|
port: opts.port,
|
|
145
141
|
host,
|
|
146
142
|
path,
|
|
143
|
+
// Nothing outlives a request, so closing the listener is the whole
|
|
144
|
+
// shutdown: each request's server and transport are already torn down by
|
|
145
|
+
// the `close` handler on its own response.
|
|
147
146
|
close: async () => {
|
|
148
147
|
await new Promise((resolve) => httpServer.close(() => resolve()));
|
|
149
|
-
await server.close().catch(() => { });
|
|
150
148
|
},
|
|
151
149
|
};
|
|
152
150
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { type RunRecordTransactionInput, type RunSynthesizePolicyInput, runRecordTransaction, runSynthesizePolicy, } from '@crediolabs/policy-synth/run';
|
|
2
|
+
export { RecordTransactionToolShape, SynthesizePolicyToolShape, } from './schemas.ts';
|
|
3
|
+
export { createMcpServer, registerTools } from './server.ts';
|
|
4
|
+
export type { McpToolError, McpToolResult } from './tools/result.ts';
|
|
5
|
+
export { mcpErrorFromCore, mcpResultFromCore } from './tools/result.ts';
|
|
6
|
+
export { startHttpServer } from './transports/http.ts';
|
|
7
|
+
export { startStdioServer } from './transports/stdio.ts';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// packages/policy-builder-mcp/src/index.ts - public re-exports for the MCP server package.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.startStdioServer = exports.startHttpServer = exports.mcpResultFromCore = exports.mcpErrorFromCore = exports.registerTools = exports.createMcpServer = exports.SynthesizePolicyToolShape = exports.RecordTransactionToolShape = exports.runSynthesizePolicy = exports.runRecordTransaction = void 0;
|
|
5
|
+
var run_1 = require("@crediolabs/policy-synth/run");
|
|
6
|
+
Object.defineProperty(exports, "runRecordTransaction", { enumerable: true, get: function () { return run_1.runRecordTransaction; } });
|
|
7
|
+
Object.defineProperty(exports, "runSynthesizePolicy", { enumerable: true, get: function () { return run_1.runSynthesizePolicy; } });
|
|
8
|
+
var schemas_ts_1 = require("./schemas.js");
|
|
9
|
+
Object.defineProperty(exports, "RecordTransactionToolShape", { enumerable: true, get: function () { return schemas_ts_1.RecordTransactionToolShape; } });
|
|
10
|
+
Object.defineProperty(exports, "SynthesizePolicyToolShape", { enumerable: true, get: function () { return schemas_ts_1.SynthesizePolicyToolShape; } });
|
|
11
|
+
var server_ts_1 = require("./server.js");
|
|
12
|
+
Object.defineProperty(exports, "createMcpServer", { enumerable: true, get: function () { return server_ts_1.createMcpServer; } });
|
|
13
|
+
Object.defineProperty(exports, "registerTools", { enumerable: true, get: function () { return server_ts_1.registerTools; } });
|
|
14
|
+
var result_ts_1 = require("./tools/result.js");
|
|
15
|
+
Object.defineProperty(exports, "mcpErrorFromCore", { enumerable: true, get: function () { return result_ts_1.mcpErrorFromCore; } });
|
|
16
|
+
Object.defineProperty(exports, "mcpResultFromCore", { enumerable: true, get: function () { return result_ts_1.mcpResultFromCore; } });
|
|
17
|
+
var http_ts_1 = require("./transports/http.js");
|
|
18
|
+
Object.defineProperty(exports, "startHttpServer", { enumerable: true, get: function () { return http_ts_1.startHttpServer; } });
|
|
19
|
+
var stdio_ts_1 = require("./transports/stdio.js");
|
|
20
|
+
Object.defineProperty(exports, "startStdioServer", { enumerable: true, get: function () { return stdio_ts_1.startStdioServer; } });
|