@apexmcp/sdk 1.0.0 → 1.0.2
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/dist/index.d.ts +53 -1
- package/dist/index.js +2 -184
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -35,10 +35,54 @@ type ApexServerOptions = {
|
|
|
35
35
|
instructions?: string;
|
|
36
36
|
capabilities?: ServerCapabilities;
|
|
37
37
|
};
|
|
38
|
+
type ApexHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'ALL';
|
|
39
|
+
type ApexHttpHandlerResult = Response | string | number | boolean | null | undefined | Record<string, unknown> | unknown;
|
|
40
|
+
type ApexHttpHandler = (request: Request) => Promise<ApexHttpHandlerResult> | ApexHttpHandlerResult;
|
|
41
|
+
type ApexMiddleware = (request: Request, next: () => Promise<Response>) => Promise<Response> | Response;
|
|
42
|
+
type ApexHealthInfo = {
|
|
43
|
+
status: 'ok';
|
|
44
|
+
name: string;
|
|
45
|
+
version: string;
|
|
46
|
+
title?: string;
|
|
47
|
+
timestamp: string;
|
|
48
|
+
uptime_seconds: number;
|
|
49
|
+
tools_count: number;
|
|
50
|
+
resources_count: number;
|
|
51
|
+
};
|
|
52
|
+
type ApexHealthHandler = (request: Request, info: ApexHealthInfo) => Promise<ApexHttpHandlerResult> | ApexHttpHandlerResult;
|
|
38
53
|
type ApexServer = {
|
|
39
54
|
readonly mcp: McpServer;
|
|
40
55
|
tool<S extends TSchema>(def: ToolDefinition<S>): ApexServer;
|
|
41
56
|
resource(def: ResourceDefinition): ApexServer;
|
|
57
|
+
/**
|
|
58
|
+
* Add a web middleware that wraps the entire HTTP pipeline (`/health`, `/mcp`, and custom routes).
|
|
59
|
+
*
|
|
60
|
+
* Middleware signature is Koa-ish:
|
|
61
|
+
* - `request`: the incoming Request
|
|
62
|
+
* - `next()`: invokes the next middleware / final handler
|
|
63
|
+
*/
|
|
64
|
+
middleware(mw: ApexMiddleware): ApexServer;
|
|
65
|
+
/**
|
|
66
|
+
* Customize the default `/health` response.
|
|
67
|
+
*
|
|
68
|
+
* If a handler is provided, its return value will be normalized into a Response:
|
|
69
|
+
* - `Response` is returned as-is
|
|
70
|
+
* - `string` -> 200 text/plain
|
|
71
|
+
* - anything else -> 200 application/json
|
|
72
|
+
*/
|
|
73
|
+
health(handler?: ApexHealthHandler): ApexServer;
|
|
74
|
+
/**
|
|
75
|
+
* Minimal HTTP routing helpers.
|
|
76
|
+
*
|
|
77
|
+
* Handlers can return a `Response`, a string, or JSON-serializable data.
|
|
78
|
+
*/
|
|
79
|
+
route(method: ApexHttpMethod, path: string, handler: ApexHttpHandler): ApexServer;
|
|
80
|
+
all(path: string, handler: ApexHttpHandler): ApexServer;
|
|
81
|
+
get(path: string, handler: ApexHttpHandler): ApexServer;
|
|
82
|
+
post(path: string, handler: ApexHttpHandler): ApexServer;
|
|
83
|
+
put(path: string, handler: ApexHttpHandler): ApexServer;
|
|
84
|
+
patch(path: string, handler: ApexHttpHandler): ApexServer;
|
|
85
|
+
delete(path: string, handler: ApexHttpHandler): ApexServer;
|
|
42
86
|
/**
|
|
43
87
|
* Web-standard MCP handler for HTTP-only deployments (Deno Deploy, Bun, Workers, etc).
|
|
44
88
|
*
|
|
@@ -93,10 +137,18 @@ declare function text(text: string, structuredContent?: Record<string, unknown>)
|
|
|
93
137
|
declare function json(value: unknown): ToolHandlerResult;
|
|
94
138
|
|
|
95
139
|
declare function createServer(name: string, version: string, options?: ApexServerOptions): ApexServer;
|
|
140
|
+
declare function CreateServer(options?: {
|
|
141
|
+
name?: string;
|
|
142
|
+
version?: string;
|
|
143
|
+
} | (ApexServerOptions & {
|
|
144
|
+
name?: string;
|
|
145
|
+
version?: string;
|
|
146
|
+
})): ApexServer;
|
|
96
147
|
declare const apex: {
|
|
97
148
|
createServer: typeof createServer;
|
|
149
|
+
CreateServer: typeof CreateServer;
|
|
98
150
|
text: typeof text;
|
|
99
151
|
json: typeof json;
|
|
100
152
|
};
|
|
101
153
|
|
|
102
|
-
export { type ApexPlugin, type ApexServer, type ApexServerOptions, type ResourceDefinition, type ResourceHandler, type ToolDefinition, type ToolHandler, apex, createServer };
|
|
154
|
+
export { type ApexHealthHandler, type ApexHealthInfo, type ApexHttpHandler, type ApexHttpHandlerResult, type ApexHttpMethod, type ApexMiddleware, type ApexPlugin, type ApexServer, type ApexServerOptions, CreateServer, type ResourceDefinition, type ResourceHandler, type ToolDefinition, type ToolHandler, apex, createServer };
|
package/dist/index.js
CHANGED
|
@@ -1,185 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
-
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
5
|
-
|
|
6
|
-
// src/lib/content.ts
|
|
7
|
-
function text(text2, structuredContent) {
|
|
8
|
-
return {
|
|
9
|
-
content: [{ type: "text", text: text2 }],
|
|
10
|
-
...structuredContent === void 0 ? {} : { structuredContent }
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
function json(value) {
|
|
14
|
-
const structured = typeof value === "object" && value !== null ? value : { value };
|
|
15
|
-
return text(JSON.stringify(value, null, 2), structured);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// src/lib/helpers.ts
|
|
19
|
-
function writeStderr(line) {
|
|
20
|
-
if (typeof process !== "undefined" && process.stderr?.write) {
|
|
21
|
-
process.stderr.write(`${line}
|
|
22
|
-
`);
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// src/lib/apex.ts
|
|
28
|
-
var ApexServerImpl = class {
|
|
29
|
-
mcp;
|
|
30
|
-
info;
|
|
31
|
-
shutdownHandlers = [];
|
|
32
|
-
toolIndex = [];
|
|
33
|
-
resourceIndex = [];
|
|
34
|
-
closing = false;
|
|
35
|
-
webTransport;
|
|
36
|
-
webConnected;
|
|
37
|
-
cachedRoutes;
|
|
38
|
-
constructor(info, options = {}, mcp) {
|
|
39
|
-
this.info = info;
|
|
40
|
-
this.mcp = mcp ?? new McpServer(
|
|
41
|
-
{ name: info.name, title: options.title ?? info.name, version: info.version },
|
|
42
|
-
options.instructions || options.capabilities ? { instructions: options.instructions, capabilities: options.capabilities } : void 0
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
fetch = async (request) => {
|
|
46
|
-
return await this.asFetch()(request);
|
|
47
|
-
};
|
|
48
|
-
asFetch(options = {}) {
|
|
49
|
-
const mcpPath = options.mcpPath ?? "/mcp";
|
|
50
|
-
const healthPath = options.healthPath ?? "/health";
|
|
51
|
-
return async (request) => {
|
|
52
|
-
const url = new URL(request.url);
|
|
53
|
-
if (url.pathname === healthPath) return await this.routes().health(request);
|
|
54
|
-
if (url.pathname !== mcpPath) {
|
|
55
|
-
return new Response(JSON.stringify({ error: "Not Found" }), {
|
|
56
|
-
status: 404,
|
|
57
|
-
headers: { "Content-Type": "application/json" }
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
return await this.routes().mcp(request);
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
routes() {
|
|
64
|
-
if (this.cachedRoutes) return this.cachedRoutes;
|
|
65
|
-
const health = async (_request) => {
|
|
66
|
-
return new Response(JSON.stringify({ status: "ok" }), {
|
|
67
|
-
status: 200,
|
|
68
|
-
headers: { "Content-Type": "application/json" }
|
|
69
|
-
});
|
|
70
|
-
};
|
|
71
|
-
const mcp = async (request) => {
|
|
72
|
-
if (!this.webTransport) {
|
|
73
|
-
this.webTransport = new WebStandardStreamableHTTPServerTransport();
|
|
74
|
-
}
|
|
75
|
-
if (!this.webConnected) {
|
|
76
|
-
this.webConnected = this.mcp.connect(this.webTransport);
|
|
77
|
-
}
|
|
78
|
-
await this.webConnected;
|
|
79
|
-
return await this.webTransport.handleRequest(request);
|
|
80
|
-
};
|
|
81
|
-
this.cachedRoutes = { mcp, health };
|
|
82
|
-
return this.cachedRoutes;
|
|
83
|
-
}
|
|
84
|
-
tool(def) {
|
|
85
|
-
this.toolIndex.push({
|
|
86
|
-
name: def.name,
|
|
87
|
-
title: def.title,
|
|
88
|
-
description: def.description
|
|
89
|
-
});
|
|
90
|
-
this.mcp.registerTool(
|
|
91
|
-
def.name,
|
|
92
|
-
{
|
|
93
|
-
title: def.title ?? def.name,
|
|
94
|
-
description: def.description,
|
|
95
|
-
// MCP SDK accepts Zod shapes or generic JSON schemas (AnySchema). TypeBox schemas are JSON schemas.
|
|
96
|
-
inputSchema: def.input,
|
|
97
|
-
...def.output ? { outputSchema: def.output } : {},
|
|
98
|
-
...def.annotations ? { annotations: def.annotations } : {}
|
|
99
|
-
},
|
|
100
|
-
(async (args) => await def.handler(args))
|
|
101
|
-
);
|
|
102
|
-
return this;
|
|
103
|
-
}
|
|
104
|
-
resource(def) {
|
|
105
|
-
this.resourceIndex.push({
|
|
106
|
-
name: def.name,
|
|
107
|
-
uri: def.uri,
|
|
108
|
-
mimeType: def.mimeType
|
|
109
|
-
});
|
|
110
|
-
const config = {
|
|
111
|
-
...def.mimeType ? { mimeType: def.mimeType } : {},
|
|
112
|
-
...def.description ? { description: def.description } : {}
|
|
113
|
-
};
|
|
114
|
-
if (typeof def.uri === "string") {
|
|
115
|
-
this.mcp.registerResource(def.name, def.uri, config, async (uri) => {
|
|
116
|
-
return await def.handler(uri.toString(), void 0);
|
|
117
|
-
});
|
|
118
|
-
} else {
|
|
119
|
-
this.mcp.registerResource(def.name, def.uri, config, async (uri, variables) => {
|
|
120
|
-
return await def.handler(uri.toString(), variables);
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
return this;
|
|
124
|
-
}
|
|
125
|
-
use(plugin) {
|
|
126
|
-
void Promise.resolve(plugin(this));
|
|
127
|
-
return this;
|
|
128
|
-
}
|
|
129
|
-
onShutdown(cb) {
|
|
130
|
-
this.shutdownHandlers.push(cb);
|
|
131
|
-
return this;
|
|
132
|
-
}
|
|
133
|
-
manifest() {
|
|
134
|
-
return {
|
|
135
|
-
name: this.info.name,
|
|
136
|
-
version: this.info.version,
|
|
137
|
-
tools: [...this.toolIndex],
|
|
138
|
-
resources: [...this.resourceIndex]
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
async listenStdio(options = {}) {
|
|
142
|
-
const transport = new StdioServerTransport();
|
|
143
|
-
await this.mcp.connect(transport);
|
|
144
|
-
writeStderr(`${this.info.name} MCP server running on stdio`);
|
|
145
|
-
if (options.handleSigint !== false && typeof process !== "undefined") {
|
|
146
|
-
process.on("SIGINT", () => {
|
|
147
|
-
void this.closeAndExit(0);
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
async closeAndExit(exitCode) {
|
|
152
|
-
if (this.closing) return;
|
|
153
|
-
this.closing = true;
|
|
154
|
-
try {
|
|
155
|
-
await this.mcp.close();
|
|
156
|
-
} finally {
|
|
157
|
-
for (const fn of this.shutdownHandlers) {
|
|
158
|
-
await fn();
|
|
159
|
-
}
|
|
160
|
-
if (typeof process !== "undefined" && typeof process.exit === "function") {
|
|
161
|
-
process.exit(exitCode);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
function createServer(name, version, options) {
|
|
167
|
-
return new ApexServerImpl({ name, version }, options);
|
|
168
|
-
}
|
|
169
|
-
var apex = {
|
|
170
|
-
createServer,
|
|
171
|
-
text,
|
|
172
|
-
json
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
// src/index.ts
|
|
176
|
-
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
177
|
-
import { Type, Type as Type2 } from "@sinclair/typebox";
|
|
178
|
-
export {
|
|
179
|
-
ResourceTemplate,
|
|
180
|
-
Type,
|
|
181
|
-
apex,
|
|
182
|
-
createServer,
|
|
183
|
-
Type2 as t
|
|
184
|
-
};
|
|
1
|
+
import{McpServer as v}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as y}from"@modelcontextprotocol/sdk/server/stdio.js";import{WebStandardStreamableHTTPServerTransport as A}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function p(n,e){return{content:[{type:"text",text:n}],...e===void 0?{}:{structuredContent:e}}}function h(n){let e=typeof n=="object"&&n!==null?n:{value:n};return p(JSON.stringify(n,null,2),e)}function d(n){if(typeof process<"u"&&process.stderr?.write){process.stderr.write(`${n}
|
|
2
|
+
`);return}}var l=class{mcp;info;options;startedAtMs=Date.now();shutdownHandlers=[];toolIndex=[];resourceIndex=[];closing=!1;webTransport;webConnected;cachedRoutes;middlewares=[];httpRoutes=[];healthHandler;constructor(e,t={},r){this.info=e,this.options=t,this.mcp=r??new v({name:e.name,title:t.title??e.name,version:e.version},t.instructions||t.capabilities?{instructions:t.instructions,capabilities:t.capabilities}:void 0)}fetch=async e=>await this.asFetch()(e);asFetch(e={}){let t=e.mcpPath??"/mcp",r=e.healthPath??"/health";return async s=>{let i=new URL(s.url);return await this.handleHttpRequest(s,{mcpPath:t,healthPath:r,pathname:i.pathname})}}routes(){if(this.cachedRoutes)return this.cachedRoutes;let e=async r=>(this.webTransport||(this.webTransport=new A),this.webConnected||(this.webConnected=this.mcp.connect(this.webTransport)),await this.webConnected,await this.webTransport.handleRequest(r)),t=async r=>await this.handleHealth(r);return this.cachedRoutes={mcp:e,health:t},this.cachedRoutes}middleware(e){return this.middlewares.push(e),this}health(e){return this.healthHandler=e,this}route(e,t,r){return this.httpRoutes.push({method:e,path:t,handler:r}),this}all(e,t){return this.route("ALL",e,t)}get(e,t){return this.route("GET",e,t)}post(e,t){return this.route("POST",e,t)}put(e,t){return this.route("PUT",e,t)}patch(e,t){return this.route("PATCH",e,t)}delete(e,t){return this.route("DELETE",e,t)}tool(e){return this.toolIndex.push({name:e.name,title:e.title,description:e.description}),this.mcp.registerTool(e.name,{title:e.title??e.name,description:e.description,inputSchema:e.input,...e.output?{outputSchema:e.output}:{},...e.annotations?{annotations:e.annotations}:{}},(async t=>await e.handler(t))),this}resource(e){this.resourceIndex.push({name:e.name,uri:e.uri,mimeType:e.mimeType});let t={...e.mimeType?{mimeType:e.mimeType}:{},...e.description?{description:e.description}:{}};return typeof e.uri=="string"?this.mcp.registerResource(e.name,e.uri,t,async r=>await e.handler(r.toString(),void 0)):this.mcp.registerResource(e.name,e.uri,t,async(r,s)=>await e.handler(r.toString(),s)),this}use(e){return Promise.resolve(e(this)),this}onShutdown(e){return this.shutdownHandlers.push(e),this}manifest(){return{name:this.info.name,version:this.info.version,tools:[...this.toolIndex],resources:[...this.resourceIndex]}}async listenStdio(e={}){let t=new y;await this.mcp.connect(t),d(`${this.info.name} MCP server running on stdio`),e.handleSigint!==!1&&typeof process<"u"&&process.on("SIGINT",()=>{this.closeAndExit(0)})}async closeAndExit(e){if(!this.closing){this.closing=!0;try{await this.mcp.close()}finally{for(let t of this.shutdownHandlers)await t();typeof process<"u"&&typeof process.exit=="function"&&process.exit(e)}}}buildHealthInfo(){let e=typeof process<"u"&&typeof process.uptime=="function"?process.uptime():(Date.now()-this.startedAtMs)/1e3;return{status:"ok",name:this.info.name,version:this.info.version,...this.options.title?{title:this.options.title}:{},timestamp:new Date().toISOString(),uptime_seconds:Math.floor(e),tools_count:this.toolIndex.length,resources_count:this.resourceIndex.length}}async handleHealth(e){let t=this.buildHealthInfo(),r=await Promise.resolve(this.healthHandler?this.healthHandler(e,t):t);return this.normalizeHttpResult(r)}async handleHttpRequest(e,t){return await this.runMiddlewares(e,async()=>{let r=(e.method||"GET").toUpperCase(),{pathname:s,mcpPath:i,healthPath:o}=t;if(s===o)return r!=="GET"&&r!=="HEAD"?this.jsonResponse({error:"Method Not Allowed"},405):await this.handleHealth(e);if(s===i)return await this.routes().mcp(e);let c=this.httpRoutes.find(a=>a.path===s&&(a.method==="ALL"||a.method===r));if(!c)return this.jsonResponse({error:"Not Found"},404);let x=await Promise.resolve(c.handler(e));return this.normalizeHttpResult(x)})}async runMiddlewares(e,t){let r=-1,s=async i=>{if(i<=r)return this.jsonResponse({error:"Middleware chain error"},500);r=i;let o=this.middlewares[i];return o?await o(e,async()=>await s(i+1)):await t()};return await s(0)}jsonResponse(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}normalizeHttpResult(e){return e instanceof Response?e:e===void 0?new Response(null,{status:204}):typeof e=="string"?new Response(e,{status:200,headers:{"Content-Type":"text/plain"}}):this.jsonResponse(e,200)}};function u(n,e,t){return new l({name:n,version:e},t)}function m(n={}){let e="name"in n&&n.name?n.name:"apex-mcp-server",t="version"in n&&n.version?n.version:"0.0.0",{name:r,version:s,...i}=n;return u(e,t,i)}var H={createServer:u,CreateServer:m,text:p,json:h};import{ResourceTemplate as j}from"@modelcontextprotocol/sdk/server/mcp.js";import{Type as C,Type as O}from"@sinclair/typebox";export{m as CreateServer,j as ResourceTemplate,C as Type,H as apex,u as createServer,O as t};
|
|
185
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/apex.ts","../src/lib/content.ts","../src/lib/helpers.ts","../src/index.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';\nimport type { AnySchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport type { Variables } from '@modelcontextprotocol/sdk/shared/uriTemplate.js';\nimport type { ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { TSchema } from '@sinclair/typebox';\n\nimport { json, text } from './content.js';\nimport { writeStderr } from './helpers.js';\nimport type {\n ApexPlugin,\n ApexServer,\n ApexServerOptions,\n ResourceDefinition,\n ToolDefinition,\n ToolHandlerResult,\n} from './types.js';\n\ntype ServerInfo = { name: string; version: string };\n\nclass ApexServerImpl implements ApexServer {\n public readonly mcp: McpServer;\n\n private readonly info: ServerInfo;\n private readonly shutdownHandlers: Array<() => void | Promise<void>> = [];\n private readonly toolIndex: Array<Pick<ToolDefinition, 'name' | 'title' | 'description'>> = [];\n private readonly resourceIndex: Array<Pick<ResourceDefinition, 'name' | 'uri' | 'mimeType'>> =\n [];\n private closing = false;\n private webTransport?: WebStandardStreamableHTTPServerTransport;\n private webConnected?: Promise<void>;\n private cachedRoutes?: ReturnType<ApexServer['routes']>;\n\n public constructor(info: ServerInfo, options: ApexServerOptions = {}, mcp?: McpServer) {\n this.info = info;\n this.mcp =\n mcp ??\n new McpServer(\n { name: info.name, title: options.title ?? info.name, version: info.version },\n options.instructions || options.capabilities\n ? { instructions: options.instructions, capabilities: options.capabilities }\n : undefined\n );\n }\n\n public readonly fetch = async (request: Request): Promise<Response> => {\n return await this.asFetch()(request);\n };\n\n public asFetch(\n options: { mcpPath?: string; healthPath?: string } = {}\n ): (request: Request) => Promise<Response> {\n const mcpPath = options.mcpPath ?? '/mcp';\n const healthPath = options.healthPath ?? '/health';\n\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n\n if (url.pathname === healthPath) return await this.routes().health(request);\n\n if (url.pathname !== mcpPath) {\n return new Response(JSON.stringify({ error: 'Not Found' }), {\n status: 404,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return await this.routes().mcp(request);\n };\n }\n\n public routes(): ReturnType<ApexServer['routes']> {\n if (this.cachedRoutes) return this.cachedRoutes;\n\n const health = async (_request: Request): Promise<Response> => {\n return new Response(JSON.stringify({ status: 'ok' }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n };\n\n const mcp = async (request: Request): Promise<Response> => {\n if (!this.webTransport) {\n // Default is stateless (sessionIdGenerator undefined), perfect for HTTP-only serverless deploys.\n this.webTransport = new WebStandardStreamableHTTPServerTransport();\n }\n if (!this.webConnected) {\n this.webConnected = this.mcp.connect(this.webTransport);\n }\n await this.webConnected;\n return await this.webTransport.handleRequest(request);\n };\n\n this.cachedRoutes = { mcp, health };\n return this.cachedRoutes;\n }\n\n public tool<S extends TSchema>(def: ToolDefinition<S>): ApexServer {\n this.toolIndex.push({\n name: def.name,\n title: def.title,\n description: def.description,\n });\n\n this.mcp.registerTool(\n def.name,\n {\n title: def.title ?? def.name,\n description: def.description,\n // MCP SDK accepts Zod shapes or generic JSON schemas (AnySchema). TypeBox schemas are JSON schemas.\n inputSchema: def.input as unknown as AnySchema,\n ...(def.output ? { outputSchema: def.output as unknown as AnySchema } : {}),\n ...(def.annotations ? { annotations: def.annotations } : {}),\n },\n (async (args: unknown) => await def.handler(args as any)) as unknown as ToolCallback<AnySchema>\n );\n\n return this;\n }\n\n public resource(def: ResourceDefinition): ApexServer {\n this.resourceIndex.push({\n name: def.name,\n uri: def.uri,\n mimeType: def.mimeType,\n });\n\n const config = {\n ...(def.mimeType ? { mimeType: def.mimeType } : {}),\n ...(def.description ? { description: def.description } : {}),\n };\n\n if (typeof def.uri === 'string') {\n this.mcp.registerResource(def.name, def.uri, config, async (uri: URL) => {\n return await def.handler(uri.toString(), undefined);\n });\n } else {\n this.mcp.registerResource(def.name, def.uri, config, async (uri: URL, variables: Variables) => {\n return await def.handler(uri.toString(), variables);\n });\n }\n\n return this;\n }\n\n public use(plugin: ApexPlugin): ApexServer {\n // Support async plugins without forcing `.use()` to be async.\n void Promise.resolve(plugin(this));\n return this;\n }\n\n public onShutdown(cb: () => void | Promise<void>): ApexServer {\n this.shutdownHandlers.push(cb);\n return this;\n }\n\n public manifest(): ReturnType<ApexServer['manifest']> {\n return {\n name: this.info.name,\n version: this.info.version,\n tools: [...this.toolIndex],\n resources: [...this.resourceIndex],\n };\n }\n\n public async listenStdio(options: { handleSigint?: boolean } = {}): Promise<void> {\n const transport = new StdioServerTransport();\n await this.mcp.connect(transport);\n\n writeStderr(`${this.info.name} MCP server running on stdio`);\n\n if (options.handleSigint !== false && typeof process !== 'undefined') {\n process.on('SIGINT', () => {\n void this.closeAndExit(0);\n });\n }\n }\n\n private async closeAndExit(exitCode: number): Promise<void> {\n if (this.closing) return;\n this.closing = true;\n\n try {\n await this.mcp.close();\n } finally {\n for (const fn of this.shutdownHandlers) {\n await fn();\n }\n if (typeof process !== 'undefined' && typeof process.exit === 'function') {\n process.exit(exitCode);\n }\n }\n }\n}\n\nexport function createServer(\n name: string,\n version: string,\n options?: ApexServerOptions\n): ApexServer {\n return new ApexServerImpl({ name, version }, options);\n}\n\nexport const apex = {\n createServer,\n text,\n json,\n};\n\n\n","import type { ToolHandlerResult } from './types.js';\n\nexport function text(\n text: string,\n structuredContent?: Record<string, unknown>\n): ToolHandlerResult {\n return {\n content: [{ type: 'text', text }],\n ...(structuredContent === undefined ? {} : { structuredContent }),\n };\n}\n\nexport function json(value: unknown): ToolHandlerResult {\n const structured =\n typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : { value };\n return text(JSON.stringify(value, null, 2), structured);\n}\n\n\n","export function writeStderr(line: string): void {\n // Node/Bun\n if (typeof process !== 'undefined' && process.stderr?.write) {\n process.stderr.write(`${line}\\n`);\n return;\n }\n}\n\n\n","export { apex, createServer } from './lib/apex.js';\nexport type {\n ApexServer,\n ApexServerOptions,\n ApexPlugin,\n ToolDefinition,\n ToolHandler,\n ResourceDefinition,\n ResourceHandler,\n} from './lib/types.js';\n\nexport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nexport { Type, Type as t } from '@sinclair/typebox';\nexport type { Static, TSchema } from '@sinclair/typebox';\n\n\n"],"mappings":";AAAA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,gDAAgD;;;ACAlD,SAAS,KACdA,OACA,mBACmB;AACnB,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAAA,MAAK,CAAC;AAAA,IAChC,GAAI,sBAAsB,SAAY,CAAC,IAAI,EAAE,kBAAkB;AAAA,EACjE;AACF;AAEO,SAAS,KAAK,OAAmC;AACtD,QAAM,aACJ,OAAO,UAAU,YAAY,UAAU,OAClC,QACD,EAAE,MAAM;AACd,SAAO,KAAK,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,UAAU;AACxD;;;AClBO,SAAS,YAAY,MAAoB;AAE9C,MAAI,OAAO,YAAY,eAAe,QAAQ,QAAQ,OAAO;AAC3D,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAChC;AAAA,EACF;AACF;;;AFeA,IAAM,iBAAN,MAA2C;AAAA,EACzB;AAAA,EAEC;AAAA,EACA,mBAAsD,CAAC;AAAA,EACvD,YAA2E,CAAC;AAAA,EAC5E,gBACf,CAAC;AAAA,EACK,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EAED,YAAY,MAAkB,UAA6B,CAAC,GAAG,KAAiB;AACrF,SAAK,OAAO;AACZ,SAAK,MACH,OACA,IAAI;AAAA,MACF,EAAE,MAAM,KAAK,MAAM,OAAO,QAAQ,SAAS,KAAK,MAAM,SAAS,KAAK,QAAQ;AAAA,MAC5E,QAAQ,gBAAgB,QAAQ,eAC5B,EAAE,cAAc,QAAQ,cAAc,cAAc,QAAQ,aAAa,IACzE;AAAA,IACN;AAAA,EACJ;AAAA,EAEgB,QAAQ,OAAO,YAAwC;AACrE,WAAO,MAAM,KAAK,QAAQ,EAAE,OAAO;AAAA,EACrC;AAAA,EAEO,QACL,UAAqD,CAAC,GACb;AACzC,UAAM,UAAU,QAAQ,WAAW;AACnC,UAAM,aAAa,QAAQ,cAAc;AAEzC,WAAO,OAAO,YAAwC;AACpD,YAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAE/B,UAAI,IAAI,aAAa,WAAY,QAAO,MAAM,KAAK,OAAO,EAAE,OAAO,OAAO;AAE1E,UAAI,IAAI,aAAa,SAAS;AAC5B,eAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,GAAG;AAAA,UAC1D,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,aAAO,MAAM,KAAK,OAAO,EAAE,IAAI,OAAO;AAAA,IACxC;AAAA,EACF;AAAA,EAEO,SAA2C;AAChD,QAAI,KAAK,aAAc,QAAO,KAAK;AAEnC,UAAM,SAAS,OAAO,aAAyC;AAC7D,aAAO,IAAI,SAAS,KAAK,UAAU,EAAE,QAAQ,KAAK,CAAC,GAAG;AAAA,QACpD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAEA,UAAM,MAAM,OAAO,YAAwC;AACzD,UAAI,CAAC,KAAK,cAAc;AAEtB,aAAK,eAAe,IAAI,yCAAyC;AAAA,MACnE;AACA,UAAI,CAAC,KAAK,cAAc;AACtB,aAAK,eAAe,KAAK,IAAI,QAAQ,KAAK,YAAY;AAAA,MACxD;AACA,YAAM,KAAK;AACX,aAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAAA,IACtD;AAEA,SAAK,eAAe,EAAE,KAAK,OAAO;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,KAAwB,KAAoC;AACjE,SAAK,UAAU,KAAK;AAAA,MAClB,MAAM,IAAI;AAAA,MACV,OAAO,IAAI;AAAA,MACX,aAAa,IAAI;AAAA,IACnB,CAAC;AAED,SAAK,IAAI;AAAA,MACP,IAAI;AAAA,MACJ;AAAA,QACE,OAAO,IAAI,SAAS,IAAI;AAAA,QACxB,aAAa,IAAI;AAAA;AAAA,QAEjB,aAAa,IAAI;AAAA,QACjB,GAAI,IAAI,SAAS,EAAE,cAAc,IAAI,OAA+B,IAAI,CAAC;AAAA,QACzE,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;AAAA,MAC5D;AAAA,OACC,OAAO,SAAkB,MAAM,IAAI,QAAQ,IAAW;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,KAAqC;AACnD,SAAK,cAAc,KAAK;AAAA,MACtB,MAAM,IAAI;AAAA,MACV,KAAK,IAAI;AAAA,MACT,UAAU,IAAI;AAAA,IAChB,CAAC;AAED,UAAM,SAAS;AAAA,MACb,GAAI,IAAI,WAAW,EAAE,UAAU,IAAI,SAAS,IAAI,CAAC;AAAA,MACjD,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;AAAA,IAC5D;AAEA,QAAI,OAAO,IAAI,QAAQ,UAAU;AAC/B,WAAK,IAAI,iBAAiB,IAAI,MAAM,IAAI,KAAK,QAAQ,OAAO,QAAa;AACvE,eAAO,MAAM,IAAI,QAAQ,IAAI,SAAS,GAAG,MAAS;AAAA,MACpD,CAAC;AAAA,IACH,OAAO;AACL,WAAK,IAAI,iBAAiB,IAAI,MAAM,IAAI,KAAK,QAAQ,OAAO,KAAU,cAAyB;AAC7F,eAAO,MAAM,IAAI,QAAQ,IAAI,SAAS,GAAG,SAAS;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,IAAI,QAAgC;AAEzC,SAAK,QAAQ,QAAQ,OAAO,IAAI,CAAC;AACjC,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,IAA4C;AAC5D,SAAK,iBAAiB,KAAK,EAAE;AAC7B,WAAO;AAAA,EACT;AAAA,EAEO,WAA+C;AACpD,WAAO;AAAA,MACL,MAAM,KAAK,KAAK;AAAA,MAChB,SAAS,KAAK,KAAK;AAAA,MACnB,OAAO,CAAC,GAAG,KAAK,SAAS;AAAA,MACzB,WAAW,CAAC,GAAG,KAAK,aAAa;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAa,YAAY,UAAsC,CAAC,GAAkB;AAChF,UAAM,YAAY,IAAI,qBAAqB;AAC3C,UAAM,KAAK,IAAI,QAAQ,SAAS;AAEhC,gBAAY,GAAG,KAAK,KAAK,IAAI,8BAA8B;AAE3D,QAAI,QAAQ,iBAAiB,SAAS,OAAO,YAAY,aAAa;AACpE,cAAQ,GAAG,UAAU,MAAM;AACzB,aAAK,KAAK,aAAa,CAAC;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,UAAiC;AAC1D,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AAEf,QAAI;AACF,YAAM,KAAK,IAAI,MAAM;AAAA,IACvB,UAAE;AACA,iBAAW,MAAM,KAAK,kBAAkB;AACtC,cAAM,GAAG;AAAA,MACX;AACA,UAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,SAAS,YAAY;AACxE,gBAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,aACd,MACA,SACA,SACY;AACZ,SAAO,IAAI,eAAe,EAAE,MAAM,QAAQ,GAAG,OAAO;AACtD;AAEO,IAAM,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF;;;AGrMA,SAAS,wBAAwB;AAEjC,SAAS,MAAc,QAARC,aAAiB;","names":["text","Type"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/apex.ts","../src/lib/content.ts","../src/lib/helpers.ts","../src/index.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';\nimport type { AnySchema } from '@modelcontextprotocol/sdk/server/zod-compat.js';\nimport type { Variables } from '@modelcontextprotocol/sdk/shared/uriTemplate.js';\nimport type { ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { TSchema } from '@sinclair/typebox';\n\nimport { json, text } from './content.js';\nimport { writeStderr } from './helpers.js';\nimport type {\n ApexPlugin,\n ApexHealthHandler,\n ApexHealthInfo,\n ApexHttpHandler,\n ApexHttpHandlerResult,\n ApexHttpMethod,\n ApexMiddleware,\n ApexServer,\n ApexServerOptions,\n ResourceDefinition,\n ToolDefinition,\n ToolHandlerResult,\n} from './types.js';\n\ntype ServerInfo = { name: string; version: string };\n\ntype HttpRoute = {\n method: ApexHttpMethod;\n path: string;\n handler: ApexHttpHandler;\n};\n\nclass ApexServerImpl implements ApexServer {\n public readonly mcp: McpServer;\n\n private readonly info: ServerInfo;\n private readonly options: ApexServerOptions;\n private readonly startedAtMs = Date.now();\n private readonly shutdownHandlers: Array<() => void | Promise<void>> = [];\n private readonly toolIndex: Array<Pick<ToolDefinition, 'name' | 'title' | 'description'>> = [];\n private readonly resourceIndex: Array<Pick<ResourceDefinition, 'name' | 'uri' | 'mimeType'>> =\n [];\n private closing = false;\n private webTransport?: WebStandardStreamableHTTPServerTransport;\n private webConnected?: Promise<void>;\n private cachedRoutes?: ReturnType<ApexServer['routes']>;\n\n private readonly middlewares: ApexMiddleware[] = [];\n private readonly httpRoutes: HttpRoute[] = [];\n\n private healthHandler?: ApexHealthHandler;\n\n public constructor(info: ServerInfo, options: ApexServerOptions = {}, mcp?: McpServer) {\n this.info = info;\n this.options = options;\n this.mcp =\n mcp ??\n new McpServer(\n { name: info.name, title: options.title ?? info.name, version: info.version },\n options.instructions || options.capabilities\n ? { instructions: options.instructions, capabilities: options.capabilities }\n : undefined\n );\n }\n\n public readonly fetch = async (request: Request): Promise<Response> => {\n return await this.asFetch()(request);\n };\n\n public asFetch(\n options: { mcpPath?: string; healthPath?: string } = {}\n ): (request: Request) => Promise<Response> {\n const mcpPath = options.mcpPath ?? '/mcp';\n const healthPath = options.healthPath ?? '/health';\n\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n return await this.handleHttpRequest(request, {\n mcpPath,\n healthPath,\n pathname: url.pathname,\n });\n };\n }\n\n public routes(): ReturnType<ApexServer['routes']> {\n if (this.cachedRoutes) return this.cachedRoutes;\n\n const mcp = async (request: Request): Promise<Response> => {\n if (!this.webTransport) {\n // Default is stateless (sessionIdGenerator undefined), perfect for HTTP-only serverless deploys.\n this.webTransport = new WebStandardStreamableHTTPServerTransport();\n }\n if (!this.webConnected) {\n this.webConnected = this.mcp.connect(this.webTransport);\n }\n await this.webConnected;\n return await this.webTransport.handleRequest(request);\n };\n\n const health = async (request: Request): Promise<Response> => {\n return await this.handleHealth(request);\n };\n\n this.cachedRoutes = { mcp, health };\n return this.cachedRoutes;\n }\n\n public middleware(mw: ApexMiddleware): ApexServer {\n this.middlewares.push(mw);\n return this;\n }\n\n public health(handler?: ApexHealthHandler): ApexServer {\n this.healthHandler = handler;\n return this;\n }\n\n public route(method: ApexHttpMethod, path: string, handler: ApexHttpHandler): ApexServer {\n this.httpRoutes.push({ method, path, handler });\n return this;\n }\n\n public all(path: string, handler: ApexHttpHandler): ApexServer {\n return this.route('ALL', path, handler);\n }\n\n public get(path: string, handler: ApexHttpHandler): ApexServer {\n return this.route('GET', path, handler);\n }\n\n public post(path: string, handler: ApexHttpHandler): ApexServer {\n return this.route('POST', path, handler);\n }\n\n public put(path: string, handler: ApexHttpHandler): ApexServer {\n return this.route('PUT', path, handler);\n }\n\n public patch(path: string, handler: ApexHttpHandler): ApexServer {\n return this.route('PATCH', path, handler);\n }\n\n public delete(path: string, handler: ApexHttpHandler): ApexServer {\n return this.route('DELETE', path, handler);\n }\n\n public tool<S extends TSchema>(def: ToolDefinition<S>): ApexServer {\n this.toolIndex.push({\n name: def.name,\n title: def.title,\n description: def.description,\n });\n\n this.mcp.registerTool(\n def.name,\n {\n title: def.title ?? def.name,\n description: def.description,\n // MCP SDK accepts Zod shapes or generic JSON schemas (AnySchema). TypeBox schemas are JSON schemas.\n inputSchema: def.input as unknown as AnySchema,\n ...(def.output ? { outputSchema: def.output as unknown as AnySchema } : {}),\n ...(def.annotations ? { annotations: def.annotations } : {}),\n },\n (async (args: unknown) => await def.handler(args as any)) as unknown as ToolCallback<AnySchema>\n );\n\n return this;\n }\n\n public resource(def: ResourceDefinition): ApexServer {\n this.resourceIndex.push({\n name: def.name,\n uri: def.uri,\n mimeType: def.mimeType,\n });\n\n const config = {\n ...(def.mimeType ? { mimeType: def.mimeType } : {}),\n ...(def.description ? { description: def.description } : {}),\n };\n\n if (typeof def.uri === 'string') {\n this.mcp.registerResource(def.name, def.uri, config, async (uri: URL) => {\n return await def.handler(uri.toString(), undefined);\n });\n } else {\n this.mcp.registerResource(def.name, def.uri, config, async (uri: URL, variables: Variables) => {\n return await def.handler(uri.toString(), variables);\n });\n }\n\n return this;\n }\n\n public use(plugin: ApexPlugin): ApexServer {\n // Support async plugins without forcing `.use()` to be async.\n void Promise.resolve(plugin(this));\n return this;\n }\n\n public onShutdown(cb: () => void | Promise<void>): ApexServer {\n this.shutdownHandlers.push(cb);\n return this;\n }\n\n public manifest(): ReturnType<ApexServer['manifest']> {\n return {\n name: this.info.name,\n version: this.info.version,\n tools: [...this.toolIndex],\n resources: [...this.resourceIndex],\n };\n }\n\n public async listenStdio(options: { handleSigint?: boolean } = {}): Promise<void> {\n const transport = new StdioServerTransport();\n await this.mcp.connect(transport);\n\n writeStderr(`${this.info.name} MCP server running on stdio`);\n\n if (options.handleSigint !== false && typeof process !== 'undefined') {\n process.on('SIGINT', () => {\n void this.closeAndExit(0);\n });\n }\n }\n\n private async closeAndExit(exitCode: number): Promise<void> {\n if (this.closing) return;\n this.closing = true;\n\n try {\n await this.mcp.close();\n } finally {\n for (const fn of this.shutdownHandlers) {\n await fn();\n }\n if (typeof process !== 'undefined' && typeof process.exit === 'function') {\n process.exit(exitCode);\n }\n }\n }\n\n private buildHealthInfo(): ApexHealthInfo {\n const uptimeSeconds =\n typeof process !== 'undefined' && typeof process.uptime === 'function'\n ? process.uptime()\n : (Date.now() - this.startedAtMs) / 1000;\n\n return {\n status: 'ok',\n name: this.info.name,\n version: this.info.version,\n ...(this.options.title ? { title: this.options.title } : {}),\n timestamp: new Date().toISOString(),\n uptime_seconds: Math.floor(uptimeSeconds),\n tools_count: this.toolIndex.length,\n resources_count: this.resourceIndex.length,\n };\n }\n\n private async handleHealth(request: Request): Promise<Response> {\n const info = this.buildHealthInfo();\n const out = await Promise.resolve(\n this.healthHandler ? this.healthHandler(request, info) : info\n );\n return this.normalizeHttpResult(out);\n }\n\n private async handleHttpRequest(\n request: Request,\n routing: { pathname: string; mcpPath: string; healthPath: string }\n ): Promise<Response> {\n return await this.runMiddlewares(request, async () => {\n const method = (request.method || 'GET').toUpperCase();\n const { pathname, mcpPath, healthPath } = routing;\n\n if (pathname === healthPath) {\n if (method !== 'GET' && method !== 'HEAD') {\n return this.jsonResponse({ error: 'Method Not Allowed' }, 405);\n }\n return await this.handleHealth(request);\n }\n\n if (pathname === mcpPath) {\n return await this.routes().mcp(request);\n }\n\n const route = this.httpRoutes.find(\n r => r.path === pathname && (r.method === 'ALL' || r.method === (method as ApexHttpMethod))\n );\n if (!route) return this.jsonResponse({ error: 'Not Found' }, 404);\n\n const out = await Promise.resolve(route.handler(request));\n return this.normalizeHttpResult(out);\n });\n }\n\n private async runMiddlewares(request: Request, final: () => Promise<Response>): Promise<Response> {\n let index = -1;\n\n const dispatch = async (i: number): Promise<Response> => {\n if (i <= index) {\n return this.jsonResponse({ error: 'Middleware chain error' }, 500);\n }\n index = i;\n\n const mw = this.middlewares[i];\n if (!mw) return await final();\n return await mw(request, async () => await dispatch(i + 1));\n };\n\n return await dispatch(0);\n }\n\n private jsonResponse(body: unknown, status = 200): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n private normalizeHttpResult(out: ApexHttpHandlerResult): Response {\n if (out instanceof Response) return out;\n\n if (out === undefined) return new Response(null, { status: 204 });\n if (typeof out === 'string') {\n return new Response(out, { status: 200, headers: { 'Content-Type': 'text/plain' } });\n }\n\n // Everything else -> JSON (numbers/booleans/null/objects/arrays)\n return this.jsonResponse(out, 200);\n }\n}\n\nexport function createServer(\n name: string,\n version: string,\n options?: ApexServerOptions\n): ApexServer {\n return new ApexServerImpl({ name, version }, options);\n}\n\nexport function CreateServer(\n options:\n | { name?: string; version?: string }\n | (ApexServerOptions & { name?: string; version?: string }) = {}\n): ApexServer {\n const name = 'name' in options && options.name ? options.name : 'apex-mcp-server';\n const version = 'version' in options && options.version ? options.version : '0.0.0';\n const { name: _n, version: _v, ...rest } = options as any;\n return createServer(name, version, rest);\n}\n\nexport const apex = {\n createServer,\n CreateServer,\n text,\n json,\n};\n\n\n","import type { ToolHandlerResult } from './types.js';\n\nexport function text(\n text: string,\n structuredContent?: Record<string, unknown>\n): ToolHandlerResult {\n return {\n content: [{ type: 'text', text }],\n ...(structuredContent === undefined ? {} : { structuredContent }),\n };\n}\n\nexport function json(value: unknown): ToolHandlerResult {\n const structured =\n typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : { value };\n return text(JSON.stringify(value, null, 2), structured);\n}\n\n\n","export function writeStderr(line: string): void {\n // Node/Bun\n if (typeof process !== 'undefined' && process.stderr?.write) {\n process.stderr.write(`${line}\\n`);\n return;\n }\n}\n\n\n","export { apex, createServer, CreateServer } from './lib/apex.js';\nexport type {\n ApexServer,\n ApexServerOptions,\n ApexPlugin,\n ApexHttpMethod,\n ApexHttpHandler,\n ApexHttpHandlerResult,\n ApexMiddleware,\n ApexHealthInfo,\n ApexHealthHandler,\n ToolDefinition,\n ToolHandler,\n ResourceDefinition,\n ResourceHandler,\n} from './lib/types.js';\n\nexport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nexport { Type, Type as t } from '@sinclair/typebox';\nexport type { Static, TSchema } from '@sinclair/typebox';\n\n\n"],"mappings":"AAAA,OAAS,aAAAA,MAAiB,0CAC1B,OAAS,wBAAAC,MAA4B,4CACrC,OAAS,4CAAAC,MAAgD,gECAlD,SAASC,EACdA,EACAC,EACmB,CACnB,MAAO,CACL,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAAD,CAAK,CAAC,EAChC,GAAIC,IAAsB,OAAY,CAAC,EAAI,CAAE,kBAAAA,CAAkB,CACjE,CACF,CAEO,SAASC,EAAKC,EAAmC,CACtD,IAAMC,EACJ,OAAOD,GAAU,UAAYA,IAAU,KAClCA,EACD,CAAE,MAAAA,CAAM,EACd,OAAOH,EAAK,KAAK,UAAUG,EAAO,KAAM,CAAC,EAAGC,CAAU,CACxD,CClBO,SAASC,EAAYC,EAAoB,CAE9C,GAAI,OAAO,QAAY,KAAe,QAAQ,QAAQ,MAAO,CAC3D,QAAQ,OAAO,MAAM,GAAGA,CAAI;AAAA,CAAI,EAChC,MACF,CACF,CF2BA,IAAMC,EAAN,KAA2C,CACzB,IAEC,KACA,QACA,YAAc,KAAK,IAAI,EACvB,iBAAsD,CAAC,EACvD,UAA2E,CAAC,EAC5E,cACf,CAAC,EACK,QAAU,GACV,aACA,aACA,aAES,YAAgC,CAAC,EACjC,WAA0B,CAAC,EAEpC,cAED,YAAYC,EAAkBC,EAA6B,CAAC,EAAGC,EAAiB,CACrF,KAAK,KAAOF,EACZ,KAAK,QAAUC,EACf,KAAK,IACHC,GACA,IAAIC,EACF,CAAE,KAAMH,EAAK,KAAM,MAAOC,EAAQ,OAASD,EAAK,KAAM,QAASA,EAAK,OAAQ,EAC5EC,EAAQ,cAAgBA,EAAQ,aAC5B,CAAE,aAAcA,EAAQ,aAAc,aAAcA,EAAQ,YAAa,EACzE,MACN,CACJ,CAEgB,MAAQ,MAAOG,GACtB,MAAM,KAAK,QAAQ,EAAEA,CAAO,EAG9B,QACLH,EAAqD,CAAC,EACb,CACzC,IAAMI,EAAUJ,EAAQ,SAAW,OAC7BK,EAAaL,EAAQ,YAAc,UAEzC,MAAO,OAAOG,GAAwC,CACpD,IAAMG,EAAM,IAAI,IAAIH,EAAQ,GAAG,EAC/B,OAAO,MAAM,KAAK,kBAAkBA,EAAS,CAC3C,QAAAC,EACA,WAAAC,EACA,SAAUC,EAAI,QAChB,CAAC,CACH,CACF,CAEO,QAA2C,CAChD,GAAI,KAAK,aAAc,OAAO,KAAK,aAEnC,IAAML,EAAM,MAAOE,IACZ,KAAK,eAER,KAAK,aAAe,IAAII,GAErB,KAAK,eACR,KAAK,aAAe,KAAK,IAAI,QAAQ,KAAK,YAAY,GAExD,MAAM,KAAK,aACJ,MAAM,KAAK,aAAa,cAAcJ,CAAO,GAGhDK,EAAS,MAAOL,GACb,MAAM,KAAK,aAAaA,CAAO,EAGxC,YAAK,aAAe,CAAE,IAAAF,EAAK,OAAAO,CAAO,EAC3B,KAAK,YACd,CAEO,WAAWC,EAAgC,CAChD,YAAK,YAAY,KAAKA,CAAE,EACjB,IACT,CAEO,OAAOC,EAAyC,CACrD,YAAK,cAAgBA,EACd,IACT,CAEO,MAAMC,EAAwBC,EAAcF,EAAsC,CACvF,YAAK,WAAW,KAAK,CAAE,OAAAC,EAAQ,KAAAC,EAAM,QAAAF,CAAQ,CAAC,EACvC,IACT,CAEO,IAAIE,EAAcF,EAAsC,CAC7D,OAAO,KAAK,MAAM,MAAOE,EAAMF,CAAO,CACxC,CAEO,IAAIE,EAAcF,EAAsC,CAC7D,OAAO,KAAK,MAAM,MAAOE,EAAMF,CAAO,CACxC,CAEO,KAAKE,EAAcF,EAAsC,CAC9D,OAAO,KAAK,MAAM,OAAQE,EAAMF,CAAO,CACzC,CAEO,IAAIE,EAAcF,EAAsC,CAC7D,OAAO,KAAK,MAAM,MAAOE,EAAMF,CAAO,CACxC,CAEO,MAAME,EAAcF,EAAsC,CAC/D,OAAO,KAAK,MAAM,QAASE,EAAMF,CAAO,CAC1C,CAEO,OAAOE,EAAcF,EAAsC,CAChE,OAAO,KAAK,MAAM,SAAUE,EAAMF,CAAO,CAC3C,CAEO,KAAwBG,EAAoC,CACjE,YAAK,UAAU,KAAK,CAClB,KAAMA,EAAI,KACV,MAAOA,EAAI,MACX,YAAaA,EAAI,WACnB,CAAC,EAED,KAAK,IAAI,aACPA,EAAI,KACJ,CACE,MAAOA,EAAI,OAASA,EAAI,KACxB,YAAaA,EAAI,YAEjB,YAAaA,EAAI,MACjB,GAAIA,EAAI,OAAS,CAAE,aAAcA,EAAI,MAA+B,EAAI,CAAC,EACzE,GAAIA,EAAI,YAAc,CAAE,YAAaA,EAAI,WAAY,EAAI,CAAC,CAC5D,GACC,MAAOC,GAAkB,MAAMD,EAAI,QAAQC,CAAW,EACzD,EAEO,IACT,CAEO,SAASD,EAAqC,CACnD,KAAK,cAAc,KAAK,CACtB,KAAMA,EAAI,KACV,IAAKA,EAAI,IACT,SAAUA,EAAI,QAChB,CAAC,EAED,IAAME,EAAS,CACb,GAAIF,EAAI,SAAW,CAAE,SAAUA,EAAI,QAAS,EAAI,CAAC,EACjD,GAAIA,EAAI,YAAc,CAAE,YAAaA,EAAI,WAAY,EAAI,CAAC,CAC5D,EAEA,OAAI,OAAOA,EAAI,KAAQ,SACrB,KAAK,IAAI,iBAAiBA,EAAI,KAAMA,EAAI,IAAKE,EAAQ,MAAOC,GACnD,MAAMH,EAAI,QAAQG,EAAI,SAAS,EAAG,MAAS,CACnD,EAED,KAAK,IAAI,iBAAiBH,EAAI,KAAMA,EAAI,IAAKE,EAAQ,MAAOC,EAAUC,IAC7D,MAAMJ,EAAI,QAAQG,EAAI,SAAS,EAAGC,CAAS,CACnD,EAGI,IACT,CAEO,IAAIC,EAAgC,CAEzC,OAAK,QAAQ,QAAQA,EAAO,IAAI,CAAC,EAC1B,IACT,CAEO,WAAWC,EAA4C,CAC5D,YAAK,iBAAiB,KAAKA,CAAE,EACtB,IACT,CAEO,UAA+C,CACpD,MAAO,CACL,KAAM,KAAK,KAAK,KAChB,QAAS,KAAK,KAAK,QACnB,MAAO,CAAC,GAAG,KAAK,SAAS,EACzB,UAAW,CAAC,GAAG,KAAK,aAAa,CACnC,CACF,CAEA,MAAa,YAAYnB,EAAsC,CAAC,EAAkB,CAChF,IAAMoB,EAAY,IAAIC,EACtB,MAAM,KAAK,IAAI,QAAQD,CAAS,EAEhCE,EAAY,GAAG,KAAK,KAAK,IAAI,8BAA8B,EAEvDtB,EAAQ,eAAiB,IAAS,OAAO,QAAY,KACvD,QAAQ,GAAG,SAAU,IAAM,CACpB,KAAK,aAAa,CAAC,CAC1B,CAAC,CAEL,CAEA,MAAc,aAAauB,EAAiC,CAC1D,GAAI,MAAK,QACT,MAAK,QAAU,GAEf,GAAI,CACF,MAAM,KAAK,IAAI,MAAM,CACvB,QAAE,CACA,QAAWC,KAAM,KAAK,iBACpB,MAAMA,EAAG,EAEP,OAAO,QAAY,KAAe,OAAO,QAAQ,MAAS,YAC5D,QAAQ,KAAKD,CAAQ,CAEzB,EACF,CAEQ,iBAAkC,CACxC,IAAME,EACJ,OAAO,QAAY,KAAe,OAAO,QAAQ,QAAW,WACxD,QAAQ,OAAO,GACd,KAAK,IAAI,EAAI,KAAK,aAAe,IAExC,MAAO,CACL,OAAQ,KACR,KAAM,KAAK,KAAK,KAChB,QAAS,KAAK,KAAK,QACnB,GAAI,KAAK,QAAQ,MAAQ,CAAE,MAAO,KAAK,QAAQ,KAAM,EAAI,CAAC,EAC1D,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,eAAgB,KAAK,MAAMA,CAAa,EACxC,YAAa,KAAK,UAAU,OAC5B,gBAAiB,KAAK,cAAc,MACtC,CACF,CAEA,MAAc,aAAatB,EAAqC,CAC9D,IAAMJ,EAAO,KAAK,gBAAgB,EAC5B2B,EAAM,MAAM,QAAQ,QACxB,KAAK,cAAgB,KAAK,cAAcvB,EAASJ,CAAI,EAAIA,CAC3D,EACA,OAAO,KAAK,oBAAoB2B,CAAG,CACrC,CAEA,MAAc,kBACZvB,EACAwB,EACmB,CACnB,OAAO,MAAM,KAAK,eAAexB,EAAS,SAAY,CACpD,IAAMQ,GAAUR,EAAQ,QAAU,OAAO,YAAY,EAC/C,CAAE,SAAAyB,EAAU,QAAAxB,EAAS,WAAAC,CAAW,EAAIsB,EAE1C,GAAIC,IAAavB,EACf,OAAIM,IAAW,OAASA,IAAW,OAC1B,KAAK,aAAa,CAAE,MAAO,oBAAqB,EAAG,GAAG,EAExD,MAAM,KAAK,aAAaR,CAAO,EAGxC,GAAIyB,IAAaxB,EACf,OAAO,MAAM,KAAK,OAAO,EAAE,IAAID,CAAO,EAGxC,IAAM0B,EAAQ,KAAK,WAAW,KAC5BC,GAAKA,EAAE,OAASF,IAAaE,EAAE,SAAW,OAASA,EAAE,SAAYnB,EACnE,EACA,GAAI,CAACkB,EAAO,OAAO,KAAK,aAAa,CAAE,MAAO,WAAY,EAAG,GAAG,EAEhE,IAAMH,EAAM,MAAM,QAAQ,QAAQG,EAAM,QAAQ1B,CAAO,CAAC,EACxD,OAAO,KAAK,oBAAoBuB,CAAG,CACrC,CAAC,CACH,CAEA,MAAc,eAAevB,EAAkB4B,EAAmD,CAChG,IAAIC,EAAQ,GAENC,EAAW,MAAO,GAAiC,CACvD,GAAI,GAAKD,EACP,OAAO,KAAK,aAAa,CAAE,MAAO,wBAAyB,EAAG,GAAG,EAEnEA,EAAQ,EAER,IAAMvB,EAAK,KAAK,YAAY,CAAC,EAC7B,OAAKA,EACE,MAAMA,EAAGN,EAAS,SAAY,MAAM8B,EAAS,EAAI,CAAC,CAAC,EAD1C,MAAMF,EAAM,CAE9B,EAEA,OAAO,MAAME,EAAS,CAAC,CACzB,CAEQ,aAAaC,EAAeC,EAAS,IAAe,CAC1D,OAAO,IAAI,SAAS,KAAK,UAAUD,CAAI,EAAG,CACxC,OAAAC,EACA,QAAS,CAAE,eAAgB,kBAAmB,CAChD,CAAC,CACH,CAEQ,oBAAoBT,EAAsC,CAChE,OAAIA,aAAe,SAAiBA,EAEhCA,IAAQ,OAAkB,IAAI,SAAS,KAAM,CAAE,OAAQ,GAAI,CAAC,EAC5D,OAAOA,GAAQ,SACV,IAAI,SAASA,EAAK,CAAE,OAAQ,IAAK,QAAS,CAAE,eAAgB,YAAa,CAAE,CAAC,EAI9E,KAAK,aAAaA,EAAK,GAAG,CACnC,CACF,EAEO,SAASU,EACdC,EACAC,EACAtC,EACY,CACZ,OAAO,IAAIF,EAAe,CAAE,KAAAuC,EAAM,QAAAC,CAAQ,EAAGtC,CAAO,CACtD,CAEO,SAASuC,EACdvC,EAEgE,CAAC,EACrD,CACZ,IAAMqC,EAAO,SAAUrC,GAAWA,EAAQ,KAAOA,EAAQ,KAAO,kBAC1DsC,EAAU,YAAatC,GAAWA,EAAQ,QAAUA,EAAQ,QAAU,QACtE,CAAE,KAAMwC,EAAI,QAASC,EAAI,GAAGC,CAAK,EAAI1C,EAC3C,OAAOoC,EAAaC,EAAMC,EAASI,CAAI,CACzC,CAEO,IAAMC,EAAO,CAClB,aAAAP,EACA,aAAAG,EACA,KAAAK,EACA,KAAAC,CACF,EGxVA,OAAS,oBAAAC,MAAwB,0CAEjC,OAAS,QAAAC,EAAc,QAARA,MAAiB","names":["McpServer","StdioServerTransport","WebStandardStreamableHTTPServerTransport","text","structuredContent","json","value","structured","writeStderr","line","ApexServerImpl","info","options","mcp","McpServer","request","mcpPath","healthPath","url","WebStandardStreamableHTTPServerTransport","health","mw","handler","method","path","def","args","config","uri","variables","plugin","cb","transport","StdioServerTransport","writeStderr","exitCode","fn","uptimeSeconds","out","routing","pathname","route","r","final","index","dispatch","body","status","createServer","name","version","CreateServer","_n","_v","rest","apex","text","json","ResourceTemplate","Type"]}
|