@emseepea/server 0.25.0 → 0.25.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/README.md +90 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +73 -16
- package/dist/telemetry.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -359,6 +359,96 @@ each adapter an independent flush opportunity. Set
|
|
|
359
359
|
`observabilityFlushTimeoutMs` in `serveEmseepea` to change the 1,000 millisecond
|
|
360
360
|
default, up to 60,000 milliseconds.
|
|
361
361
|
|
|
362
|
+
### Follow a request into backend work
|
|
363
|
+
|
|
364
|
+
`openTelemetry()` creates a server span when an MCP HTTP request starts and
|
|
365
|
+
ends it when the response finishes or the caller disconnects. It keeps that
|
|
366
|
+
span active through asynchronous request work, so instrumented backend calls
|
|
367
|
+
can create child spans. Request counters and duration histograms keep their
|
|
368
|
+
existing names and safe attributes.
|
|
369
|
+
|
|
370
|
+
First configure your OpenTelemetry provider, asynchronous context manager,
|
|
371
|
+
trace-context propagator and exporter. Em See Pea does not install global
|
|
372
|
+
providers or instrument your backends. Without a tracing provider, its trace
|
|
373
|
+
API is a no-op. Without context management or propagation, traces will not
|
|
374
|
+
connect across asynchronous work or incoming requests respectively.
|
|
375
|
+
|
|
376
|
+
This Node.js example exports traces to the console. Save it as
|
|
377
|
+
`tracing-server.mjs` in a project with these dependencies:
|
|
378
|
+
|
|
379
|
+
```sh
|
|
380
|
+
npm install @emseepea/server zod @opentelemetry/api@1.9.1 @opentelemetry/core@2.10.0 @opentelemetry/context-async-hooks@2.10.0 @opentelemetry/sdk-trace@2.10.0
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
```js
|
|
384
|
+
import { context, propagation, trace } from "@opentelemetry/api";
|
|
385
|
+
import { AsyncLocalStorageContextManager } from "@opentelemetry/context-async-hooks";
|
|
386
|
+
import { W3CTraceContextPropagator } from "@opentelemetry/core";
|
|
387
|
+
import { BatchSpanProcessor, ConsoleSpanExporter, TracerProvider } from "@opentelemetry/sdk-trace";
|
|
388
|
+
import { createEmseepea, defineTool, openTelemetry, serveEmseepea } from "@emseepea/server";
|
|
389
|
+
import { z } from "zod";
|
|
390
|
+
|
|
391
|
+
context.setGlobalContextManager(new AsyncLocalStorageContextManager().enable());
|
|
392
|
+
propagation.setGlobalPropagator(new W3CTraceContextPropagator());
|
|
393
|
+
const provider = new TracerProvider({
|
|
394
|
+
spanProcessors: [new BatchSpanProcessor({ exporter: new ConsoleSpanExporter() })],
|
|
395
|
+
});
|
|
396
|
+
trace.setGlobalTracerProvider(provider);
|
|
397
|
+
const backendTracer = trace.getTracer("my-application.backend");
|
|
398
|
+
const telemetry = { ...openTelemetry(), flush: () => provider.forceFlush() };
|
|
399
|
+
|
|
400
|
+
const running = await serveEmseepea(createEmseepea({
|
|
401
|
+
name: "tracing-example",
|
|
402
|
+
version: "1.0.0",
|
|
403
|
+
observability: [telemetry],
|
|
404
|
+
tools: [defineTool({
|
|
405
|
+
name: "read-status",
|
|
406
|
+
description: "Read the example backend status.",
|
|
407
|
+
access: "public",
|
|
408
|
+
inputSchema: z.object({}),
|
|
409
|
+
outputSchema: z.object({ status: z.string() }),
|
|
410
|
+
async handler() {
|
|
411
|
+
return backendTracer.startActiveSpan("backend.read", async (span) => {
|
|
412
|
+
try {
|
|
413
|
+
// Replace this with your backend operation or its instrumentation.
|
|
414
|
+
await Promise.resolve();
|
|
415
|
+
return { data: { status: "ready" } };
|
|
416
|
+
} finally { span.end(); }
|
|
417
|
+
});
|
|
418
|
+
},
|
|
419
|
+
})],
|
|
420
|
+
}), { port: 3000 });
|
|
421
|
+
console.log(`MCP endpoint: ${running.url}`);
|
|
422
|
+
|
|
423
|
+
async function stop() {
|
|
424
|
+
await running.close();
|
|
425
|
+
await provider.shutdown();
|
|
426
|
+
context.disable();
|
|
427
|
+
propagation.disable();
|
|
428
|
+
trace.disable();
|
|
429
|
+
}
|
|
430
|
+
process.once("SIGINT", stop);
|
|
431
|
+
process.once("SIGTERM", stop);
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
Run `node tracing-server.mjs`, then call `read-status` with your MCP client.
|
|
435
|
+
The backend span and `mcp.request` span share a trace, with the backend span
|
|
436
|
+
under the request.
|
|
437
|
+
|
|
438
|
+
The adapter's flush callback gives pending spans a bounded
|
|
439
|
+
flush opportunity during server shutdown; the application then shuts down its
|
|
440
|
+
provider. Configure a meter provider and metric exporter separately to collect
|
|
441
|
+
the built-in request metrics.
|
|
442
|
+
|
|
443
|
+
Em See Pea passes only bounded `traceparent` and `tracestate` headers to the
|
|
444
|
+
configured propagator. It retains validated span context and excludes baggage.
|
|
445
|
+
Missing or invalid parent context starts a new trace. Incoming trace IDs are
|
|
446
|
+
caller-controlled correlation data, never identity or authorization.
|
|
447
|
+
|
|
448
|
+
Framework spans and events exclude request arguments, results and credentials.
|
|
449
|
+
Your backend instrumentation has its own data-capture policy; review what it
|
|
450
|
+
records before enabling it.
|
|
451
|
+
|
|
362
452
|
## Report Dependency Readiness
|
|
363
453
|
|
|
364
454
|
Pass a `readiness` callback to `createEmseepea` to check the dependencies your
|
package/dist/telemetry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAS/D,MAAM,MAAM,iBAAiB,GACzB,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,gBAAgB,GAClE,0BAA0B,GAAG,gBAAgB,GAAG,cAAc,GAAG,aAAa,GAC9E,qBAAqB,GAAG,sBAAsB,GAAG,QAAQ,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAChF,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,YAAY,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAEnG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,OAAO,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;IAClE;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;CAC/C;AAED;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,oBAAoB,CAAC;AAI7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,uBAAuB,CAAC;IAClD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;CACxD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzD,oBAAoB,CAEtB;AAkBD,wBAAgB,aAAa,IAAI,oBAAoB,CAepD;AAoBD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,SAAS,oBAAoB,EAAE,EACzC,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,EACrD,qBAAqB,EAAE,SAAS,oBAAoB,EAAE,GAAG,SAAS,EAClE,MAAM,EAAE;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,GACpC,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAoFtC;AAWD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,kBAAkB,GAAG,SAAS,CAE1F"}
|
package/dist/telemetry.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { metrics, SpanKind, trace } from "@opentelemetry/api";
|
|
1
|
+
import { context, isSpanContextValid, metrics, propagation, ROOT_CONTEXT, SpanKind, trace } from "@opentelemetry/api";
|
|
2
2
|
const methods = new Set([
|
|
3
3
|
"server/discover", "tools/list", "tools/call", "resources/list",
|
|
4
4
|
"resources/templates/list", "resources/read", "prompts/list", "prompts/get",
|
|
@@ -9,33 +9,62 @@ const requestStates = new WeakMap();
|
|
|
9
9
|
export function structuredLogging(id, write) {
|
|
10
10
|
return Object.freeze({ id, emit: write });
|
|
11
11
|
}
|
|
12
|
+
// Normalization preserves emit identity while copying the public adapter.
|
|
13
|
+
// A public adapter ID must never grant access to the request lifecycle.
|
|
14
|
+
const requestTracers = new WeakMap();
|
|
15
|
+
function eventAttributes(event) {
|
|
16
|
+
return {
|
|
17
|
+
"mcp.method": event.method,
|
|
18
|
+
...(event.capability ? { "mcp.capability.name": event.capability } : {}),
|
|
19
|
+
"http.request.method": event.httpMethod,
|
|
20
|
+
"http.response.status_code": event.statusCode,
|
|
21
|
+
"emseepea.protocol.outcome": event.protocolOutcome,
|
|
22
|
+
"emseepea.transport.outcome": event.outcome,
|
|
23
|
+
...(event.callerClass ? { "emseepea.caller.class": event.callerClass } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
12
26
|
export function openTelemetry() {
|
|
13
27
|
const tracer = trace.getTracer("@emseepea/server");
|
|
14
28
|
const meter = metrics.getMeter("@emseepea/server");
|
|
15
29
|
const calls = meter.createCounter("emseepea.http.requests", { unit: "{request}" });
|
|
16
30
|
const duration = meter.createHistogram("emseepea.http.response.duration", { unit: "s" });
|
|
17
|
-
|
|
31
|
+
const adapter = Object.freeze({
|
|
18
32
|
id: "opentelemetry",
|
|
19
33
|
emit(event) {
|
|
20
|
-
const attributes =
|
|
21
|
-
"mcp.method": event.method,
|
|
22
|
-
...(event.capability ? { "mcp.capability.name": event.capability } : {}),
|
|
23
|
-
"http.request.method": event.httpMethod,
|
|
24
|
-
"http.response.status_code": event.statusCode,
|
|
25
|
-
"emseepea.protocol.outcome": event.protocolOutcome,
|
|
26
|
-
"emseepea.transport.outcome": event.outcome,
|
|
27
|
-
...(event.callerClass ? { "emseepea.caller.class": event.callerClass } : {}),
|
|
28
|
-
};
|
|
29
|
-
const span = tracer.startSpan("mcp.request", { kind: SpanKind.SERVER });
|
|
30
|
-
span.setAttributes(attributes);
|
|
34
|
+
const attributes = eventAttributes(event);
|
|
31
35
|
calls.add(1, attributes);
|
|
32
36
|
duration.record(event.durationMs / 1_000, attributes);
|
|
33
|
-
span.end();
|
|
34
37
|
},
|
|
35
38
|
});
|
|
39
|
+
requestTracers.set(adapter.emit, tracer);
|
|
40
|
+
return adapter;
|
|
41
|
+
}
|
|
42
|
+
function startRequestSpan(tracer, request, startTime) {
|
|
43
|
+
let parent = ROOT_CONTEXT;
|
|
44
|
+
try {
|
|
45
|
+
// Only tracing headers reach the configured propagator. In particular,
|
|
46
|
+
// baggage, credentials and unrelated ambient context are excluded.
|
|
47
|
+
const carrier = {};
|
|
48
|
+
for (const name of ["traceparent", "tracestate"]) {
|
|
49
|
+
const value = request.headers[name];
|
|
50
|
+
if (typeof value === "string" && value.length <= 512)
|
|
51
|
+
carrier[name] = value;
|
|
52
|
+
}
|
|
53
|
+
const extracted = trace.getSpanContext(propagation.extract(ROOT_CONTEXT, carrier));
|
|
54
|
+
if (extracted && isSpanContextValid(extracted))
|
|
55
|
+
parent = trace.setSpanContext(ROOT_CONTEXT, extracted);
|
|
56
|
+
}
|
|
57
|
+
catch { /* A broken propagator must not prevent protocol execution. */ }
|
|
58
|
+
try {
|
|
59
|
+
return tracer.startSpan("mcp.request", { kind: SpanKind.SERVER, startTime }, parent);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
36
64
|
}
|
|
37
65
|
export function installObservability(app, adapters, capabilityName, callerClassifications, limits) {
|
|
38
66
|
const pending = new Set();
|
|
67
|
+
const tracer = adapters.map((adapter) => requestTracers.get(adapter.emit)).find((value) => value !== undefined);
|
|
39
68
|
app.addHook("onRequest", (request, reply, done) => {
|
|
40
69
|
if (request.routeOptions.url !== "/mcp") {
|
|
41
70
|
done();
|
|
@@ -44,6 +73,7 @@ export function installObservability(app, adapters, capabilityName, callerClassi
|
|
|
44
73
|
const state = { protocolOutcome: "success" };
|
|
45
74
|
requestStates.set(request, state);
|
|
46
75
|
const started = performance.now();
|
|
76
|
+
const span = tracer ? startRequestSpan(tracer, request, performance.timeOrigin + started) : undefined;
|
|
47
77
|
let ended = false;
|
|
48
78
|
const finish = () => end(reply.raw.destroyed || reply.raw.socket?.destroyed ? "disconnected" : "finished");
|
|
49
79
|
const close = () => end("disconnected");
|
|
@@ -51,6 +81,7 @@ export function installObservability(app, adapters, capabilityName, callerClassi
|
|
|
51
81
|
if (ended)
|
|
52
82
|
return;
|
|
53
83
|
ended = true;
|
|
84
|
+
const finished = performance.now();
|
|
54
85
|
reply.raw.off("finish", finish);
|
|
55
86
|
reply.raw.off("close", close);
|
|
56
87
|
const body = request.body;
|
|
@@ -74,9 +105,19 @@ export function installObservability(app, adapters, capabilityName, callerClassi
|
|
|
74
105
|
? "protocol_error"
|
|
75
106
|
: state.protocolOutcome,
|
|
76
107
|
...(callerClass ? { callerClass } : {}),
|
|
77
|
-
durationMs: Math.min(3_600_000, Math.max(0,
|
|
108
|
+
durationMs: Math.min(3_600_000, Math.max(0, finished - started)),
|
|
78
109
|
...(state.forwardingRefusal ? { forwardingRefusal: state.forwardingRefusal } : {}),
|
|
79
110
|
});
|
|
111
|
+
if (span) {
|
|
112
|
+
try {
|
|
113
|
+
span.setAttributes(eventAttributes(event));
|
|
114
|
+
}
|
|
115
|
+
catch { /* Span decoration cannot change protocol behaviour. */ }
|
|
116
|
+
try {
|
|
117
|
+
span.end(performance.timeOrigin + finished);
|
|
118
|
+
}
|
|
119
|
+
catch { /* Finalization is independent of adapter delivery. */ }
|
|
120
|
+
}
|
|
80
121
|
for (const adapter of adapters) {
|
|
81
122
|
try {
|
|
82
123
|
const delivery = bounded(Promise.resolve(adapter.emit(event)).catch(() => { }), limits.deliveryTimeoutMs);
|
|
@@ -88,7 +129,23 @@ export function installObservability(app, adapters, capabilityName, callerClassi
|
|
|
88
129
|
}
|
|
89
130
|
reply.raw.once("finish", finish);
|
|
90
131
|
reply.raw.once("close", close);
|
|
91
|
-
|
|
132
|
+
if (!span) {
|
|
133
|
+
done();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
let continued = false;
|
|
137
|
+
try {
|
|
138
|
+
context.with(trace.setSpan(ROOT_CONTEXT, span), () => {
|
|
139
|
+
continued = true;
|
|
140
|
+
done();
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// A context manager can throw before or after calling the continuation.
|
|
145
|
+
// Never retry protocol work that has already started.
|
|
146
|
+
if (!continued)
|
|
147
|
+
done();
|
|
148
|
+
}
|
|
92
149
|
});
|
|
93
150
|
return async (timeoutMs) => {
|
|
94
151
|
await bounded(Promise.all(pending), timeoutMs);
|
package/dist/telemetry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emseepea/server",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.2",
|
|
4
4
|
"description": "Fastify-first framework for Model Context Protocol 2026-07-28 servers over Streamable HTTP",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -66,8 +66,8 @@
|
|
|
66
66
|
"@modelcontextprotocol/fastify": "2.0.1",
|
|
67
67
|
"@modelcontextprotocol/node": "2.1.1",
|
|
68
68
|
"@modelcontextprotocol/server": "2.3.1",
|
|
69
|
-
"fastify": "5.12.
|
|
70
|
-
"zod": "4.
|
|
69
|
+
"fastify": "5.12.6",
|
|
70
|
+
"zod": "4.6.6"
|
|
71
71
|
},
|
|
72
72
|
"engines": {
|
|
73
73
|
"node": ">=22"
|