@apexmcp/sdk 1.0.3 → 1.0.4
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 +6 -6
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +95 -95
package/dist/index.d.ts
CHANGED
|
@@ -2,17 +2,17 @@ import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mc
|
|
|
2
2
|
export { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { Variables } from '@modelcontextprotocol/sdk/shared/uriTemplate.js';
|
|
4
4
|
import { ServerCapabilities, ToolAnnotations, CallToolResult, ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
-
import {
|
|
6
|
-
export {
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
export { z } from 'zod';
|
|
7
7
|
|
|
8
8
|
type ToolHandlerResult = CallToolResult;
|
|
9
|
-
type ToolHandler<S extends
|
|
10
|
-
type ToolDefinition<S extends
|
|
9
|
+
type ToolHandler<S extends z.ZodSchema = z.ZodSchema> = (args: z.infer<S>) => Promise<ToolHandlerResult> | ToolHandlerResult;
|
|
10
|
+
type ToolDefinition<S extends z.ZodSchema = z.ZodSchema> = {
|
|
11
11
|
name: string;
|
|
12
12
|
title?: string;
|
|
13
13
|
description: string;
|
|
14
14
|
input: S;
|
|
15
|
-
output?:
|
|
15
|
+
output?: z.ZodSchema;
|
|
16
16
|
annotations?: ToolAnnotations;
|
|
17
17
|
handler: ToolHandler<S>;
|
|
18
18
|
};
|
|
@@ -52,7 +52,7 @@ type ApexHealthInfo = {
|
|
|
52
52
|
type ApexHealthHandler = (request: Request, info: ApexHealthInfo) => Promise<ApexHttpHandlerResult> | ApexHttpHandlerResult;
|
|
53
53
|
type ApexServer = {
|
|
54
54
|
readonly mcp: McpServer;
|
|
55
|
-
tool<S extends
|
|
55
|
+
tool<S extends z.ZodSchema>(def: ToolDefinition<S>): ApexServer;
|
|
56
56
|
resource(def: ResourceDefinition): ApexServer;
|
|
57
57
|
/**
|
|
58
58
|
* Add a web middleware that wraps the entire HTTP pipeline (`/health`, `/mcp`, and custom routes).
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
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)}legacyJsonRpcPaths=new Set(["/tools/list","/tools/call","/resources/list","/resources/read","/resources/templates/list"]);async handleHttpRequest(e,t){return await this.runMiddlewares(e,async()=>{let r=(e.method||"GET").toUpperCase(),{pathname:s,mcpPath:i,healthPath:a}=t;if(s===a)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);if(this.legacyJsonRpcPaths.has(s)){let o=new URL(e.url);return o.pathname=i,await this.routes().mcp(new Request(o.toString(),e))}let u=this.httpRoutes.find(o=>o.path===s&&(o.method==="ALL"||o.method===r));if(!u)return this.jsonResponse({error:"Not Found"},404);let x=await Promise.resolve(u.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 a=this.middlewares[i];return a?await a(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 c(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 c(e,t,i)}var w={createServer:c,CreateServer:m,text:p,json:h};import{ResourceTemplate as j}from"@modelcontextprotocol/sdk/server/mcp.js";import{
|
|
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)}legacyJsonRpcPaths=new Set(["/tools/list","/tools/call","/resources/list","/resources/read","/resources/templates/list"]);async handleHttpRequest(e,t){return await this.runMiddlewares(e,async()=>{let r=(e.method||"GET").toUpperCase(),{pathname:s,mcpPath:i,healthPath:a}=t;if(s===a)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);if(this.legacyJsonRpcPaths.has(s)){let o=new URL(e.url);return o.pathname=i,await this.routes().mcp(new Request(o.toString(),e))}let u=this.httpRoutes.find(o=>o.path===s&&(o.method==="ALL"||o.method===r));if(!u)return this.jsonResponse({error:"Not Found"},404);let x=await Promise.resolve(u.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 a=this.middlewares[i];return a?await a(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 c(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 c(e,t,i)}var w={createServer:c,CreateServer:m,text:p,json:h};import{ResourceTemplate as j}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as C}from"zod";export{m as CreateServer,j as ResourceTemplate,w as apex,c as createServer,C as z};
|
|
3
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 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 readonly legacyJsonRpcPaths = new Set([\n '/tools/list',\n '/tools/call',\n '/resources/list',\n '/resources/read',\n '/resources/templates/list',\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 if (this.legacyJsonRpcPaths.has(pathname)) {\n const legacyUrl = new URL(request.url);\n legacyUrl.pathname = mcpPath;\n // Forward the request to the MCP handler while preserving the original body/headers\n return await this.routes().mcp(\n new Request(legacyUrl.toString(), request)\n );\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,CAEiB,mBAAqB,IAAI,IAAI,CAC5C,cACA,cACA,kBACA,kBACA,2BACF,CAAC,EAED,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,GAAI,KAAK,mBAAmB,IAAIyB,CAAQ,EAAG,CACzC,IAAMC,EAAY,IAAI,IAAI1B,EAAQ,GAAG,EACrC,OAAA0B,EAAU,SAAWzB,EAEd,MAAM,KAAK,OAAO,EAAE,IACzB,IAAI,QAAQyB,EAAU,SAAS,EAAG1B,CAAO,CAC3C,CACF,CAEA,IAAM2B,EAAQ,KAAK,WAAW,KAC5BC,GAAKA,EAAE,OAASH,IAAaG,EAAE,SAAW,OAASA,EAAE,SAAYpB,EACnE,EACA,GAAI,CAACmB,EAAO,OAAO,KAAK,aAAa,CAAE,MAAO,WAAY,EAAG,GAAG,EAEhE,IAAMJ,EAAM,MAAM,QAAQ,QAAQI,EAAM,QAAQ3B,CAAO,CAAC,EACxD,OAAO,KAAK,oBAAoBuB,CAAG,CACrC,CAAC,CACH,CAEA,MAAc,eAAevB,EAAkB6B,EAAmD,CAChG,IAAIC,EAAQ,GAENC,EAAW,MAAO,GAAiC,CACvD,GAAI,GAAKD,EACP,OAAO,KAAK,aAAa,CAAE,MAAO,wBAAyB,EAAG,GAAG,EAEnEA,EAAQ,EAER,IAAMxB,EAAK,KAAK,YAAY,CAAC,EAC7B,OAAKA,EACE,MAAMA,EAAGN,EAAS,SAAY,MAAM+B,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,oBAAoBV,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,SAASW,EACdC,EACAC,EACAvC,EACY,CACZ,OAAO,IAAIF,EAAe,CAAE,KAAAwC,EAAM,QAAAC,CAAQ,EAAGvC,CAAO,CACtD,CAEO,SAASwC,EACdxC,EAEgE,CAAC,EACrD,CACZ,IAAMsC,EAAO,SAAUtC,GAAWA,EAAQ,KAAOA,EAAQ,KAAO,kBAC1DuC,EAAU,YAAavC,GAAWA,EAAQ,QAAUA,EAAQ,QAAU,QACtE,CAAE,KAAMyC,EAAI,QAASC,EAAI,GAAGC,CAAK,EAAI3C,EAC3C,OAAOqC,EAAaC,EAAMC,EAASI,CAAI,CACzC,CAEO,IAAMC,EAAO,CAClB,aAAAP,EACA,aAAAG,EACA,KAAAK,EACA,KAAAC,CACF,EGzWA,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","legacyUrl","route","r","final","index","dispatch","body","status","createServer","name","version","CreateServer","_n","_v","rest","apex","text","json","ResourceTemplate","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 { z } from 'zod';\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 z.ZodSchema>(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 readonly legacyJsonRpcPaths = new Set([\n '/tools/list',\n '/tools/call',\n '/resources/list',\n '/resources/read',\n '/resources/templates/list',\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 if (this.legacyJsonRpcPaths.has(pathname)) {\n const legacyUrl = new URL(request.url);\n legacyUrl.pathname = mcpPath;\n // Forward the request to the MCP handler while preserving the original body/headers\n return await this.routes().mcp(\n new Request(legacyUrl.toString(), request)\n );\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 { z } from 'zod';\n\n\n"],"mappings":"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","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","legacyUrl","route","r","final","index","dispatch","body","status","createServer","name","version","CreateServer","_n","_v","rest","apex","text","json","ResourceTemplate","z"]}
|
package/package.json
CHANGED
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@apexmcp/sdk",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Developer-first SDK for building MCP (Model Context Protocol) servers in the ApexMCP ecosystem.",
|
|
5
|
-
"author": "@keyrxng",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"main": "./dist/index.js",
|
|
9
|
-
"types": "./dist/index.d.ts",
|
|
10
|
-
"exports": {
|
|
11
|
-
".": "./dist/index.js",
|
|
12
|
-
"./package.json": "./package.json"
|
|
13
|
-
},
|
|
14
|
-
"files": [
|
|
15
|
-
"dist",
|
|
16
|
-
"README.md",
|
|
17
|
-
"LICENSE"
|
|
18
|
-
],
|
|
19
|
-
"publishConfig": {
|
|
20
|
-
"access": "public"
|
|
21
|
-
},
|
|
22
|
-
"engines": {
|
|
23
|
-
"node": ">=18.18.0"
|
|
24
|
-
},
|
|
25
|
-
"scripts": {
|
|
26
|
-
"build": "tsup",
|
|
27
|
-
"dev": "tsup --watch",
|
|
28
|
-
"test": "jest --coverage",
|
|
29
|
-
"test:watch": "jest --watch",
|
|
30
|
-
"test:ci": "jest --coverage --ci --reporters=default --reporters=jest-junit",
|
|
31
|
-
"format": "run-s format:lint format:prettier format:cspell",
|
|
32
|
-
"format:lint": "eslint --fix .",
|
|
33
|
-
"format:prettier": "prettier --write .",
|
|
34
|
-
"format:cspell": "cspell **/*",
|
|
35
|
-
"typecheck": "tsc --noEmit",
|
|
36
|
-
"knip": "knip",
|
|
37
|
-
"clean": "rm -rf dist coverage .swc",
|
|
38
|
-
"prepublishOnly": "bun run clean && bun run build && bun run test",
|
|
39
|
-
"prepare": "husky install || true"
|
|
40
|
-
},
|
|
41
|
-
"keywords": [
|
|
42
|
-
"apexmcp",
|
|
43
|
-
"mcp",
|
|
44
|
-
"model-context-protocol",
|
|
45
|
-
"sdk",
|
|
46
|
-
"typescript",
|
|
47
|
-
"server",
|
|
48
|
-
"tools",
|
|
49
|
-
"resources"
|
|
50
|
-
],
|
|
51
|
-
"dependencies": {
|
|
52
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
53
|
-
"
|
|
54
|
-
},
|
|
55
|
-
"devDependencies": {
|
|
56
|
-
"@commitlint/config-conventional": "^20.2.0",
|
|
57
|
-
"@jest/globals": "^30.2.0",
|
|
58
|
-
"@mswjs/data": "^0.16.2",
|
|
59
|
-
"@semantic-release/changelog": "^6.0.3",
|
|
60
|
-
"@semantic-release/git": "^10.0.1",
|
|
61
|
-
"@swc/core": "^1.15.4",
|
|
62
|
-
"@swc/jest": "^0.2.39",
|
|
63
|
-
"@types/bun": "^1.3.4",
|
|
64
|
-
"@types/deno": "^2.5.0",
|
|
65
|
-
"@types/jest": "^30.0.0",
|
|
66
|
-
"@types/node": "^25.0.2",
|
|
67
|
-
"cspell": "^9.4.0",
|
|
68
|
-
"dotenv": "^17.2.3",
|
|
69
|
-
"eslint": "^9.39.2",
|
|
70
|
-
"eslint-config-prettier": "^10.1.8",
|
|
71
|
-
"eslint-plugin-import": "^2.32.0",
|
|
72
|
-
"eslint-plugin-sonarjs": "^3.0.5",
|
|
73
|
-
"husky": "^9.1.7",
|
|
74
|
-
"jest": "^30.2.0",
|
|
75
|
-
"jest-junit": "^16.0.0",
|
|
76
|
-
"knip": "^5.73.4",
|
|
77
|
-
"lint-staged": "^16.2.7",
|
|
78
|
-
"msw": "^2.12.4",
|
|
79
|
-
"npm-run-all": "^4.1.5",
|
|
80
|
-
"prettier": "^3.1.0",
|
|
81
|
-
"tsup": "^8.5.0",
|
|
82
|
-
"typescript": "^5.9.3",
|
|
83
|
-
"typescript-eslint": "^8.49.0"
|
|
84
|
-
},
|
|
85
|
-
"lint-staged": {
|
|
86
|
-
"*.ts": [
|
|
87
|
-
"prettier --write",
|
|
88
|
-
"eslint --fix"
|
|
89
|
-
],
|
|
90
|
-
"src/**.{ts,json}": [
|
|
91
|
-
"cspell"
|
|
92
|
-
]
|
|
93
|
-
},
|
|
94
|
-
"private": false
|
|
95
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@apexmcp/sdk",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"description": "Developer-first SDK for building MCP (Model Context Protocol) servers in the ApexMCP ecosystem.",
|
|
5
|
+
"author": "@keyrxng",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./dist/index.js",
|
|
12
|
+
"./package.json": "./package.json"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18.18.0"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"test": "jest --coverage",
|
|
29
|
+
"test:watch": "jest --watch",
|
|
30
|
+
"test:ci": "jest --coverage --ci --reporters=default --reporters=jest-junit",
|
|
31
|
+
"format": "run-s format:lint format:prettier format:cspell",
|
|
32
|
+
"format:lint": "eslint --fix .",
|
|
33
|
+
"format:prettier": "prettier --write .",
|
|
34
|
+
"format:cspell": "cspell **/*",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"knip": "knip",
|
|
37
|
+
"clean": "rm -rf dist coverage .swc",
|
|
38
|
+
"prepublishOnly": "bun run clean && bun run build && bun run test",
|
|
39
|
+
"prepare": "husky install || true"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"apexmcp",
|
|
43
|
+
"mcp",
|
|
44
|
+
"model-context-protocol",
|
|
45
|
+
"sdk",
|
|
46
|
+
"typescript",
|
|
47
|
+
"server",
|
|
48
|
+
"tools",
|
|
49
|
+
"resources"
|
|
50
|
+
],
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
53
|
+
"zod": "4.1.13"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@commitlint/config-conventional": "^20.2.0",
|
|
57
|
+
"@jest/globals": "^30.2.0",
|
|
58
|
+
"@mswjs/data": "^0.16.2",
|
|
59
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
60
|
+
"@semantic-release/git": "^10.0.1",
|
|
61
|
+
"@swc/core": "^1.15.4",
|
|
62
|
+
"@swc/jest": "^0.2.39",
|
|
63
|
+
"@types/bun": "^1.3.4",
|
|
64
|
+
"@types/deno": "^2.5.0",
|
|
65
|
+
"@types/jest": "^30.0.0",
|
|
66
|
+
"@types/node": "^25.0.2",
|
|
67
|
+
"cspell": "^9.4.0",
|
|
68
|
+
"dotenv": "^17.2.3",
|
|
69
|
+
"eslint": "^9.39.2",
|
|
70
|
+
"eslint-config-prettier": "^10.1.8",
|
|
71
|
+
"eslint-plugin-import": "^2.32.0",
|
|
72
|
+
"eslint-plugin-sonarjs": "^3.0.5",
|
|
73
|
+
"husky": "^9.1.7",
|
|
74
|
+
"jest": "^30.2.0",
|
|
75
|
+
"jest-junit": "^16.0.0",
|
|
76
|
+
"knip": "^5.73.4",
|
|
77
|
+
"lint-staged": "^16.2.7",
|
|
78
|
+
"msw": "^2.12.4",
|
|
79
|
+
"npm-run-all": "^4.1.5",
|
|
80
|
+
"prettier": "^3.1.0",
|
|
81
|
+
"tsup": "^8.5.0",
|
|
82
|
+
"typescript": "^5.9.3",
|
|
83
|
+
"typescript-eslint": "^8.49.0"
|
|
84
|
+
},
|
|
85
|
+
"lint-staged": {
|
|
86
|
+
"*.ts": [
|
|
87
|
+
"prettier --write",
|
|
88
|
+
"eslint --fix"
|
|
89
|
+
],
|
|
90
|
+
"src/**.{ts,json}": [
|
|
91
|
+
"cspell"
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
"private": false
|
|
95
|
+
}
|