@awarecorp/mcp-logger 0.0.2-dev.0 → 0.0.2-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +84 -1
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/interceptor.d.ts.map +1 -0
- package/dist/cli/interceptor.js +170 -1
- package/dist/cli/interceptor.js.map +1 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +5 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/index.d.ts +10 -110
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -0
- package/dist/sdk/index.d.ts +66 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +80 -1
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/instrumentation.d.ts +11 -0
- package/dist/sdk/instrumentation.d.ts.map +1 -0
- package/dist/sdk/instrumentation.js +99 -1
- package/dist/sdk/instrumentation.js.map +1 -0
- package/dist/sdk/types.d.ts +11 -40
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/sdk/types.js +5 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/shared/config.d.ts +18 -0
- package/dist/shared/config.d.ts.map +1 -0
- package/dist/shared/config.js +18 -1
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/span-utils.d.ts +31 -0
- package/dist/shared/span-utils.d.ts.map +1 -0
- package/dist/shared/span-utils.js +90 -1
- package/dist/shared/span-utils.js.map +1 -0
- package/dist/shared/telemetry.d.ts +25 -0
- package/dist/shared/telemetry.d.ts.map +1 -0
- package/dist/shared/telemetry.js +91 -1
- package/dist/shared/telemetry.js.map +1 -0
- package/dist/shared/types.d.ts +5 -6
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +5 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +5 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
package/dist/cli/cli.js
CHANGED
|
@@ -1,2 +1,85 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* MCP Logger CLI
|
|
4
|
+
*
|
|
5
|
+
* MCP 서버를 래핑하여 자동으로 observability를 추가합니다.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import { program } from 'commander';
|
|
9
|
+
import { initializeTelemetry, shutdownTelemetry } from '../shared/telemetry.js';
|
|
10
|
+
import { MessageInterceptor } from './interceptor.js';
|
|
11
|
+
program
|
|
12
|
+
.name('mcp-logger')
|
|
13
|
+
.description('Add observability to any MCP server without code changes')
|
|
14
|
+
.version('1.0.0')
|
|
15
|
+
.requiredOption('-k, --api-key <key>', 'Aware API key')
|
|
16
|
+
.option('-s, --service-name <name>', 'Service name for identification')
|
|
17
|
+
.option('-d, --debug', 'Enable debug logging', false)
|
|
18
|
+
.option('-e, --endpoint <url>', 'Custom OTLP endpoint')
|
|
19
|
+
.argument('<command...>', 'MCP server command to wrap')
|
|
20
|
+
.action(async (command, options) => {
|
|
21
|
+
try {
|
|
22
|
+
// 1. Telemetry 초기화
|
|
23
|
+
initializeTelemetry(options);
|
|
24
|
+
if (options.debug) {
|
|
25
|
+
console.error('[MCP Logger CLI] Starting MCP server:', command.join(' '));
|
|
26
|
+
}
|
|
27
|
+
// 2. MCP 서버 실행
|
|
28
|
+
const [cmd, ...args] = command;
|
|
29
|
+
const mcpServer = spawn(cmd, args, {
|
|
30
|
+
stdio: ['pipe', 'pipe', 'inherit'], // stdin, stdout, stderr
|
|
31
|
+
env: {
|
|
32
|
+
...process.env,
|
|
33
|
+
// Trace context 전파 (향후 사용)
|
|
34
|
+
MCP_LOGGER_ENABLED: 'true',
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
// 3. stdin 가로채기 (Claude → MCP Server)
|
|
38
|
+
const requestInterceptor = new MessageInterceptor('request', options.debug);
|
|
39
|
+
process.stdin.pipe(requestInterceptor).pipe(mcpServer.stdin);
|
|
40
|
+
// 4. stdout 가로채기 (MCP Server → Claude)
|
|
41
|
+
const responseInterceptor = new MessageInterceptor('response', options.debug);
|
|
42
|
+
mcpServer.stdout.pipe(responseInterceptor).pipe(process.stdout);
|
|
43
|
+
// 5. 에러 처리
|
|
44
|
+
mcpServer.on('error', async (err) => {
|
|
45
|
+
console.error('[MCP Logger CLI] Failed to start MCP server:', err);
|
|
46
|
+
await shutdownTelemetry();
|
|
47
|
+
process.exit(1);
|
|
48
|
+
});
|
|
49
|
+
mcpServer.on('exit', async (code, signal) => {
|
|
50
|
+
if (options.debug) {
|
|
51
|
+
console.error(`[MCP Logger CLI] MCP server exited with code ${code}, signal ${signal}`);
|
|
52
|
+
}
|
|
53
|
+
await shutdownTelemetry();
|
|
54
|
+
process.exit(code || 0);
|
|
55
|
+
});
|
|
56
|
+
// 6. 시그널 처리 - 한 번만 처리
|
|
57
|
+
let isShuttingDown = false;
|
|
58
|
+
const handleShutdown = async (signal) => {
|
|
59
|
+
if (isShuttingDown)
|
|
60
|
+
return;
|
|
61
|
+
isShuttingDown = true;
|
|
62
|
+
if (options.debug) {
|
|
63
|
+
console.error(`[MCP Logger CLI] Received ${signal}, shutting down...`);
|
|
64
|
+
}
|
|
65
|
+
mcpServer.kill(signal);
|
|
66
|
+
// MCP 서버가 종료될 때까지 대기 (최대 5초)
|
|
67
|
+
await Promise.race([
|
|
68
|
+
new Promise(resolve => mcpServer.once('exit', resolve)),
|
|
69
|
+
new Promise(resolve => setTimeout(resolve, 5000))
|
|
70
|
+
]);
|
|
71
|
+
await shutdownTelemetry();
|
|
72
|
+
process.exit(0);
|
|
73
|
+
};
|
|
74
|
+
process.on('SIGTERM', () => handleShutdown('SIGTERM'));
|
|
75
|
+
process.on('SIGINT', () => handleShutdown('SIGINT'));
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error('[MCP Logger CLI] Fatal error:', err);
|
|
79
|
+
await shutdownTelemetry();
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// CLI 실행
|
|
84
|
+
program.parse();
|
|
85
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../../src/cli/interceptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AASnC,OAAO,KAAK,EAAkB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,KAAK,CAAU;gBAEX,SAAS,EAAE,gBAAgB,EAAE,KAAK,GAAE,OAAe;IAM/D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;IAwB3F;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;YACW,YAAY;IA+E1B,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;CAsBvD"}
|
package/dist/cli/interceptor.js
CHANGED
|
@@ -1 +1,170 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* JSON-RPC 메시지 가로채기 및 추적
|
|
3
|
+
*
|
|
4
|
+
* stdin/stdout을 통과하는 JSON-RPC 메시지를 파싱하여 OpenTelemetry로 추적합니다.
|
|
5
|
+
*/
|
|
6
|
+
import { Transform } from 'stream';
|
|
7
|
+
import { SpanStatusCode } from '@opentelemetry/api';
|
|
8
|
+
import { getTracer } from '../shared/telemetry.js';
|
|
9
|
+
import { setSpanAttributes, addSpanEvent, markSpanSuccess, safeStringify } from '../shared/span-utils.js';
|
|
10
|
+
/**
|
|
11
|
+
* JSON-RPC 메시지 파싱 및 로깅을 위한 Transform stream
|
|
12
|
+
*/
|
|
13
|
+
export class MessageInterceptor extends Transform {
|
|
14
|
+
buffer = '';
|
|
15
|
+
direction;
|
|
16
|
+
debug;
|
|
17
|
+
constructor(direction, debug = false) {
|
|
18
|
+
super();
|
|
19
|
+
this.direction = direction;
|
|
20
|
+
this.debug = debug;
|
|
21
|
+
}
|
|
22
|
+
_transform(chunk, encoding, callback) {
|
|
23
|
+
try {
|
|
24
|
+
// 원본 데이터는 그대로 전달
|
|
25
|
+
this.push(chunk);
|
|
26
|
+
// 로깅을 위한 파싱 (비동기)
|
|
27
|
+
this.buffer += chunk.toString();
|
|
28
|
+
// 버퍼 크기 제한 (메모리 누수 방지)
|
|
29
|
+
if (this.buffer.length > 1_000_000) { // 1MB
|
|
30
|
+
if (this.debug) {
|
|
31
|
+
console.error('[MCP Logger CLI] Buffer size exceeded, clearing...');
|
|
32
|
+
}
|
|
33
|
+
this.buffer = '';
|
|
34
|
+
}
|
|
35
|
+
this.tryParseMessages();
|
|
36
|
+
callback();
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
callback(err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 버퍼에서 JSON-RPC 메시지 파싱 시도
|
|
44
|
+
*/
|
|
45
|
+
tryParseMessages() {
|
|
46
|
+
const lines = this.buffer.split('\n');
|
|
47
|
+
// 마지막 불완전한 라인은 버퍼에 보관
|
|
48
|
+
this.buffer = lines.pop() || '';
|
|
49
|
+
for (const line of lines) {
|
|
50
|
+
const trimmed = line.trim();
|
|
51
|
+
if (!trimmed)
|
|
52
|
+
continue;
|
|
53
|
+
try {
|
|
54
|
+
const message = JSON.parse(trimmed);
|
|
55
|
+
// OpenTelemetry로 로깅 (비동기지만 blocking하지 않음)
|
|
56
|
+
this.traceMessage(message).catch(err => {
|
|
57
|
+
if (this.debug) {
|
|
58
|
+
console.error('[MCP Logger CLI] Trace error:', err);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
// JSON 파싱 실패는 무시 (MCP 메시지가 아닐 수 있음)
|
|
64
|
+
if (this.debug) {
|
|
65
|
+
console.error('[MCP Logger CLI] Failed to parse:', trimmed);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 메시지를 OpenTelemetry span으로 추적
|
|
72
|
+
*/
|
|
73
|
+
async traceMessage(message) {
|
|
74
|
+
const tracer = getTracer();
|
|
75
|
+
if (!tracer) {
|
|
76
|
+
if (this.debug) {
|
|
77
|
+
console.error('[MCP Logger CLI] Tracer not initialized');
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const spanName = message.method
|
|
82
|
+
? `mcp.${message.method}`
|
|
83
|
+
: message.id !== undefined
|
|
84
|
+
? 'mcp.response'
|
|
85
|
+
: 'mcp.notification';
|
|
86
|
+
return new Promise((resolve) => {
|
|
87
|
+
tracer.startActiveSpan(spanName, (span) => {
|
|
88
|
+
try {
|
|
89
|
+
// 기본 속성 설정
|
|
90
|
+
setSpanAttributes(span, {
|
|
91
|
+
'mcp.direction': this.direction,
|
|
92
|
+
'mcp.jsonrpc': message.jsonrpc || '2.0',
|
|
93
|
+
});
|
|
94
|
+
if (message.id !== undefined) {
|
|
95
|
+
span.setAttribute('mcp.id', String(message.id));
|
|
96
|
+
}
|
|
97
|
+
if (message.method) {
|
|
98
|
+
span.setAttribute('mcp.method', message.method);
|
|
99
|
+
}
|
|
100
|
+
// params 처리
|
|
101
|
+
if (message.params) {
|
|
102
|
+
const paramsStr = safeStringify(message.params);
|
|
103
|
+
if (paramsStr) {
|
|
104
|
+
span.setAttribute('mcp.params.size', paramsStr.length);
|
|
105
|
+
if (paramsStr.length < 1000) {
|
|
106
|
+
span.setAttribute('mcp.params', paramsStr);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// 이벤트 기록
|
|
111
|
+
const messageStr = safeStringify(message);
|
|
112
|
+
if (messageStr) {
|
|
113
|
+
addSpanEvent(span, `mcp.${this.direction}`, {
|
|
114
|
+
message: messageStr,
|
|
115
|
+
timestamp: Date.now(),
|
|
116
|
+
}, this.debug);
|
|
117
|
+
}
|
|
118
|
+
if (this.debug) {
|
|
119
|
+
console.error(`[MCP Logger CLI] ${this.direction}:`, JSON.stringify(message, null, 2));
|
|
120
|
+
}
|
|
121
|
+
// 에러 체크
|
|
122
|
+
if (message.error) {
|
|
123
|
+
span.setAttribute('mcp.error', true);
|
|
124
|
+
span.setAttribute('mcp.error.code', message.error.code);
|
|
125
|
+
span.setAttribute('mcp.error.message', message.error.message);
|
|
126
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: message.error.message });
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
markSpanSuccess(span);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
if (this.debug) {
|
|
134
|
+
console.error('[MCP Logger CLI] Error in span:', err);
|
|
135
|
+
}
|
|
136
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
span.end();
|
|
140
|
+
resolve();
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
_flush(callback) {
|
|
146
|
+
try {
|
|
147
|
+
// 남은 버퍼 처리
|
|
148
|
+
if (this.buffer.trim()) {
|
|
149
|
+
try {
|
|
150
|
+
const message = JSON.parse(this.buffer);
|
|
151
|
+
this.traceMessage(message).catch(err => {
|
|
152
|
+
if (this.debug) {
|
|
153
|
+
console.error('[MCP Logger CLI] Trace error:', err);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
if (this.debug) {
|
|
159
|
+
console.error('[MCP Logger CLI] Failed to parse final buffer:', err);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
callback();
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
callback(err);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/cli/interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,gBAAgB;CAEnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,115 +1,15 @@
|
|
|
1
|
-
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
|
-
*
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* 텔레메트리 초기화 옵션
|
|
8
|
-
*/
|
|
9
|
-
interface TelemetryOptions {
|
|
10
|
-
/**
|
|
11
|
-
* API Key for authentication (필수)
|
|
12
|
-
*/
|
|
13
|
-
apiKey: string;
|
|
14
|
-
/**
|
|
15
|
-
* 서비스 이름 (옵션)
|
|
16
|
-
* 지정하지 않으면 자동으로 'mcp-server-{random}' 형식으로 생성
|
|
17
|
-
*/
|
|
18
|
-
serviceName?: string;
|
|
19
|
-
/**
|
|
20
|
-
* 커스텀 OTLP 엔드포인트 (옵션)
|
|
21
|
-
* 기본값: CONFIG.ENDPOINT
|
|
22
|
-
*/
|
|
23
|
-
endpoint?: string;
|
|
24
|
-
/**
|
|
25
|
-
* 디버그 로그 활성화 (옵션)
|
|
26
|
-
*/
|
|
27
|
-
debug?: boolean;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* SDK 타입 정의
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* SDK 초기화 옵션 (TelemetryOptions 확장)
|
|
36
|
-
*/
|
|
37
|
-
interface SDKInitOptions extends TelemetryOptions {
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* MCP Server 타입 (재export)
|
|
41
|
-
*/
|
|
42
|
-
type MCPServer = Server;
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 공통 텔레메트리 레이어
|
|
46
|
-
*
|
|
47
|
-
* OpenTelemetry SDK 초기화 및 관리를 담당합니다.
|
|
48
|
-
* SDK와 CLI 양쪽에서 공통으로 사용됩니다.
|
|
49
|
-
*/
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Telemetry 종료
|
|
53
|
-
*/
|
|
54
|
-
declare function shutdownTelemetry(): Promise<void>;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* MCP Logger SDK
|
|
58
|
-
*
|
|
59
|
-
* MCP 서버에 자동 관측성(Observability)을 추가하는 SDK입니다.
|
|
60
|
-
*/
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* MCP 서버에 자동 계측을 추가합니다.
|
|
64
|
-
*
|
|
65
|
-
* 이 함수는 MCP 서버의 모든 요청/응답을 자동으로 로깅하고 추적합니다.
|
|
66
|
-
* OpenTelemetry를 사용하여 traces를 수집하며, 설정된 엔드포인트로 전송합니다.
|
|
67
|
-
*
|
|
68
|
-
* @param server - MCP Server 인스턴스
|
|
69
|
-
* @param options - 초기화 옵션
|
|
70
|
-
*
|
|
71
|
-
* @throws {Error} apiKey가 제공되지 않은 경우
|
|
72
|
-
* @throws {Error} server 인스턴스가 제공되지 않은 경우
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* TypeScript 사용 예시:
|
|
76
|
-
* ```typescript
|
|
77
|
-
* import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
78
|
-
* import { initMCPLogger } from '@awarecorp/mcp-logger';
|
|
79
|
-
*
|
|
80
|
-
* const server = new Server({ name: 'my-server', version: '1.0.0' }, {
|
|
81
|
-
* capabilities: { tools: {} }
|
|
82
|
-
* });
|
|
83
|
-
*
|
|
84
|
-
* initMCPLogger(server, {
|
|
85
|
-
* apiKey: 'your-api-key',
|
|
86
|
-
* serviceName: 'my-mcp-server',
|
|
87
|
-
* debug: true,
|
|
88
|
-
* });
|
|
89
|
-
*
|
|
90
|
-
* server.setRequestHandler('tools/call', async (request) => {
|
|
91
|
-
* // 이 핸들러는 자동으로 로깅됩니다
|
|
92
|
-
* return { result: 'success' };
|
|
93
|
-
* });
|
|
94
|
-
* ```
|
|
2
|
+
* @awarecorp/mcp-logger
|
|
95
3
|
*
|
|
96
|
-
*
|
|
97
|
-
* JavaScript 사용 예시:
|
|
98
|
-
* ```javascript
|
|
99
|
-
* const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
100
|
-
* const { initMCPLogger } = require('@awarecorp/mcp-logger');
|
|
4
|
+
* Unified MCP observability solution
|
|
101
5
|
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
6
|
+
* This package provides:
|
|
7
|
+
* 1. SDK: For programmatic integration into MCP servers
|
|
8
|
+
* 2. CLI: For wrapping existing MCP servers without code changes
|
|
105
9
|
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
* serviceName: 'my-mcp-server',
|
|
109
|
-
* });
|
|
110
|
-
* ```
|
|
10
|
+
* NOTE: This entry point ONLY exports the SDK.
|
|
11
|
+
* CLI functionality is available through the `mcp-logger` binary.
|
|
111
12
|
*/
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
export type { MCPServer, SDKInitOptions };
|
|
13
|
+
export { initMCPLogger, shutdown } from './sdk/index.js';
|
|
14
|
+
export type { SDKInitOptions, MCPServer } from './sdk/types.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @awarecorp/mcp-logger
|
|
3
|
+
*
|
|
4
|
+
* Unified MCP observability solution
|
|
5
|
+
*
|
|
6
|
+
* This package provides:
|
|
7
|
+
* 1. SDK: For programmatic integration into MCP servers
|
|
8
|
+
* 2. CLI: For wrapping existing MCP servers without code changes
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This entry point ONLY exports the SDK.
|
|
11
|
+
* CLI functionality is available through the `mcp-logger` binary.
|
|
12
|
+
*/
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// SDK Exports (PUBLIC API)
|
|
15
|
+
// ============================================================================
|
|
16
|
+
export { initMCPLogger, shutdown } from './sdk/index.js';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// CLI is NOT exported here
|
|
19
|
+
// Access via: npx @awarecorp/mcp-logger --api-key xxx -- <command>
|
|
20
|
+
// ============================================================================
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGzD,+EAA+E;AAC/E,2BAA2B;AAC3B,mEAAmE;AACnE,+EAA+E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Logger SDK
|
|
3
|
+
*
|
|
4
|
+
* MCP 서버에 자동 관측성(Observability)을 추가하는 SDK입니다.
|
|
5
|
+
*/
|
|
6
|
+
import type { MCPServer, SDKInitOptions } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* MCP 서버에 자동 계측을 추가합니다.
|
|
9
|
+
*
|
|
10
|
+
* 이 함수는 MCP 서버의 모든 요청/응답을 자동으로 로깅하고 추적합니다.
|
|
11
|
+
* OpenTelemetry를 사용하여 traces를 수집하며, 설정된 엔드포인트로 전송합니다.
|
|
12
|
+
*
|
|
13
|
+
* @param server - MCP Server 인스턴스
|
|
14
|
+
* @param options - 초기화 옵션
|
|
15
|
+
*
|
|
16
|
+
* @throws {Error} apiKey가 제공되지 않은 경우
|
|
17
|
+
* @throws {Error} server 인스턴스가 제공되지 않은 경우
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* TypeScript 사용 예시:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
23
|
+
* import { initMCPLogger } from '@awarecorp/mcp-logger';
|
|
24
|
+
*
|
|
25
|
+
* const server = new Server({ name: 'my-server', version: '1.0.0' }, {
|
|
26
|
+
* capabilities: { tools: {} }
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* initMCPLogger(server, {
|
|
30
|
+
* apiKey: 'your-api-key',
|
|
31
|
+
* serviceName: 'my-mcp-server',
|
|
32
|
+
* debug: true,
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* server.setRequestHandler('tools/call', async (request) => {
|
|
36
|
+
* // 이 핸들러는 자동으로 로깅됩니다
|
|
37
|
+
* return { result: 'success' };
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* JavaScript 사용 예시:
|
|
43
|
+
* ```javascript
|
|
44
|
+
* const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
45
|
+
* const { initMCPLogger } = require('@awarecorp/mcp-logger');
|
|
46
|
+
*
|
|
47
|
+
* const server = new Server({ name: 'my-server', version: '1.0.0' }, {
|
|
48
|
+
* capabilities: { tools: {} }
|
|
49
|
+
* });
|
|
50
|
+
*
|
|
51
|
+
* initMCPLogger(server, {
|
|
52
|
+
* apiKey: process.env.API_KEY,
|
|
53
|
+
* serviceName: 'my-mcp-server',
|
|
54
|
+
* });
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function initMCPLogger(server: MCPServer, options: SDKInitOptions): void;
|
|
58
|
+
/**
|
|
59
|
+
* SDK를 종료하고 모든 pending traces를 flush합니다.
|
|
60
|
+
*
|
|
61
|
+
* 일반적으로 명시적으로 호출할 필요는 없습니다.
|
|
62
|
+
* 프로세스 종료 시 자동으로 처리됩니다.
|
|
63
|
+
*/
|
|
64
|
+
export { shutdownTelemetry as shutdown } from '../shared/telemetry.js';
|
|
65
|
+
export type { SDKInitOptions, MCPServer } from './types.js';
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,IAAI,CAkBN;AAED;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,IAAI,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/sdk/index.js
CHANGED
|
@@ -1 +1,80 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* MCP Logger SDK
|
|
3
|
+
*
|
|
4
|
+
* MCP 서버에 자동 관측성(Observability)을 추가하는 SDK입니다.
|
|
5
|
+
*/
|
|
6
|
+
import { initializeTelemetry } from '../shared/telemetry.js';
|
|
7
|
+
import { instrumentMCPServer } from './instrumentation.js';
|
|
8
|
+
/**
|
|
9
|
+
* MCP 서버에 자동 계측을 추가합니다.
|
|
10
|
+
*
|
|
11
|
+
* 이 함수는 MCP 서버의 모든 요청/응답을 자동으로 로깅하고 추적합니다.
|
|
12
|
+
* OpenTelemetry를 사용하여 traces를 수집하며, 설정된 엔드포인트로 전송합니다.
|
|
13
|
+
*
|
|
14
|
+
* @param server - MCP Server 인스턴스
|
|
15
|
+
* @param options - 초기화 옵션
|
|
16
|
+
*
|
|
17
|
+
* @throws {Error} apiKey가 제공되지 않은 경우
|
|
18
|
+
* @throws {Error} server 인스턴스가 제공되지 않은 경우
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* TypeScript 사용 예시:
|
|
22
|
+
* ```typescript
|
|
23
|
+
* import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
24
|
+
* import { initMCPLogger } from '@awarecorp/mcp-logger';
|
|
25
|
+
*
|
|
26
|
+
* const server = new Server({ name: 'my-server', version: '1.0.0' }, {
|
|
27
|
+
* capabilities: { tools: {} }
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* initMCPLogger(server, {
|
|
31
|
+
* apiKey: 'your-api-key',
|
|
32
|
+
* serviceName: 'my-mcp-server',
|
|
33
|
+
* debug: true,
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* server.setRequestHandler('tools/call', async (request) => {
|
|
37
|
+
* // 이 핸들러는 자동으로 로깅됩니다
|
|
38
|
+
* return { result: 'success' };
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* JavaScript 사용 예시:
|
|
44
|
+
* ```javascript
|
|
45
|
+
* const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
46
|
+
* const { initMCPLogger } = require('@awarecorp/mcp-logger');
|
|
47
|
+
*
|
|
48
|
+
* const server = new Server({ name: 'my-server', version: '1.0.0' }, {
|
|
49
|
+
* capabilities: { tools: {} }
|
|
50
|
+
* });
|
|
51
|
+
*
|
|
52
|
+
* initMCPLogger(server, {
|
|
53
|
+
* apiKey: process.env.API_KEY,
|
|
54
|
+
* serviceName: 'my-mcp-server',
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export function initMCPLogger(server, options) {
|
|
59
|
+
if (!options.apiKey) {
|
|
60
|
+
throw new Error('[MCP Logger SDK] apiKey is required');
|
|
61
|
+
}
|
|
62
|
+
if (!server) {
|
|
63
|
+
throw new Error('[MCP Logger SDK] server instance is required');
|
|
64
|
+
}
|
|
65
|
+
// 1. OpenTelemetry SDK 초기화
|
|
66
|
+
initializeTelemetry(options);
|
|
67
|
+
// 2. MCP Server 계측
|
|
68
|
+
instrumentMCPServer(server, options.debug);
|
|
69
|
+
if (options.debug) {
|
|
70
|
+
console.log('[MCP Logger SDK] ✓ Initialization complete');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* SDK를 종료하고 모든 pending traces를 flush합니다.
|
|
75
|
+
*
|
|
76
|
+
* 일반적으로 명시적으로 호출할 필요는 없습니다.
|
|
77
|
+
* 프로세스 종료 시 자동으로 처리됩니다.
|
|
78
|
+
*/
|
|
79
|
+
export { shutdownTelemetry as shutdown } from '../shared/telemetry.js';
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAqB,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAiB,EACjB,OAAuB;IAEvB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,2BAA2B;IAC3B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE7B,mBAAmB;IACnB,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,IAAI,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server 자동 계측
|
|
3
|
+
*
|
|
4
|
+
* setRequestHandler를 오버라이드하여 모든 요청/응답을 자동으로 추적합니다.
|
|
5
|
+
*/
|
|
6
|
+
import type { MCPServer } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* MCP Server에 자동 계측 적용
|
|
9
|
+
*/
|
|
10
|
+
export declare function instrumentMCPServer(server: MCPServer, debug?: boolean): void;
|
|
11
|
+
//# sourceMappingURL=instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/sdk/instrumentation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EACV,SAAS,EAKV,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,GAAE,OAAe,GAAG,IAAI,CAsHnF"}
|