paput-mcp 3.4.0 → 4.0.0
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 +86 -67
- package/dist/cli/index.js +5 -29
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/login.js +1 -1
- package/dist/cli/login.js.map +1 -1
- package/dist/cli/logout.js +3 -3
- package/dist/cli/logout.js.map +1 -1
- package/dist/cli/rules/paput-knowledge-capture.md +1 -1
- package/dist/cli/skills/paput-analyze-discard-policy/SKILL.md +3 -3
- package/dist/cli/skills/paput-capture/SKILL.md +1 -1
- package/dist/cli/skills/paput-init/SKILL.md +58 -9
- package/dist/handlers/add-knowledge-candidates/handler.js +49 -21
- package/dist/handlers/add-knowledge-candidates/handler.js.map +1 -1
- package/dist/handlers/add-knowledge-candidates/tool.js +1 -1
- package/dist/handlers/add-knowledge-candidates/tool.js.map +1 -1
- package/dist/handlers/discard-pending-candidate/handler.js +6 -21
- package/dist/handlers/discard-pending-candidate/handler.js.map +1 -1
- package/dist/handlers/get-capture-policy/handler.js +3 -3
- package/dist/handlers/get-capture-policy/handler.js.map +1 -1
- package/dist/handlers/get-capture-policy/tool.js +1 -1
- package/dist/handlers/get-capture-policy/tool.js.map +1 -1
- package/dist/handlers/get-discard-policy-context/handler.js +3 -11
- package/dist/handlers/get-discard-policy-context/handler.js.map +1 -1
- package/dist/handlers/get-discard-policy-context/tool.js +1 -1
- package/dist/handlers/get-discard-policy-context/tool.js.map +1 -1
- package/dist/handlers/get-project-context/handler.js +6 -6
- package/dist/handlers/get-project-context/handler.js.map +1 -1
- package/dist/handlers/get-project-context/tool.js +2 -2
- package/dist/handlers/get-project-context/tool.js.map +1 -1
- package/dist/handlers/index.js +2 -3
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/list-pending-candidates/handler.js +6 -9
- package/dist/handlers/list-pending-candidates/handler.js.map +1 -1
- package/dist/handlers/list-processed-sessions/handler.js +18 -0
- package/dist/handlers/list-processed-sessions/handler.js.map +1 -0
- package/dist/handlers/list-processed-sessions/index.js +3 -0
- package/dist/handlers/list-processed-sessions/index.js.map +1 -0
- package/dist/handlers/list-processed-sessions/tool.js +19 -0
- package/dist/handlers/list-processed-sessions/tool.js.map +1 -0
- package/dist/handlers/mark-processed-session/handler.js +37 -0
- package/dist/handlers/mark-processed-session/handler.js.map +1 -0
- package/dist/handlers/mark-processed-session/index.js +3 -0
- package/dist/handlers/mark-processed-session/index.js.map +1 -0
- package/dist/handlers/mark-processed-session/tool.js +28 -0
- package/dist/handlers/mark-processed-session/tool.js.map +1 -0
- package/dist/handlers/memo-projects.js +19 -5
- package/dist/handlers/memo-projects.js.map +1 -1
- package/dist/handlers/save-pending-candidate/handler.js +84 -31
- package/dist/handlers/save-pending-candidate/handler.js.map +1 -1
- package/dist/handlers/save-pending-candidate/tool.js +4 -0
- package/dist/handlers/save-pending-candidate/tool.js.map +1 -1
- package/dist/handlers/scan-sessions/handler.js +4 -2
- package/dist/handlers/scan-sessions/handler.js.map +1 -1
- package/dist/handlers/update-capture-policy/handler.js +3 -3
- package/dist/handlers/update-capture-policy/handler.js.map +1 -1
- package/dist/handlers/update-capture-policy/tool.js +2 -2
- package/dist/handlers/update-capture-policy/tool.js.map +1 -1
- package/dist/handlers/update-memo/handler.js +1 -1
- package/dist/handlers/update-memo/handler.js.map +1 -1
- package/dist/handlers/update-pending-candidate/handler.js +5 -38
- package/dist/handlers/update-pending-candidate/handler.js.map +1 -1
- package/dist/handlers/update-pending-candidate/tool.js +1 -1
- package/dist/handlers/update-pending-candidate/tool.js.map +1 -1
- package/dist/handlers/upsert-skill-sheet-project/handler.js +3 -0
- package/dist/handlers/upsert-skill-sheet-project/handler.js.map +1 -1
- package/dist/handlers/upsert-skill-sheet-project/tool.js +4 -0
- package/dist/handlers/upsert-skill-sheet-project/tool.js.map +1 -1
- package/dist/http.js +67 -21
- package/dist/http.js.map +1 -1
- package/dist/index.js +2 -9
- package/dist/index.js.map +1 -1
- package/dist/schemas/tool-input.js +30 -21
- package/dist/schemas/tool-input.js.map +1 -1
- package/dist/server.js +3 -17
- package/dist/server.js.map +1 -1
- package/dist/services/api/client.js +2 -3
- package/dist/services/api/client.js.map +1 -1
- package/dist/services/api/index.js +1 -0
- package/dist/services/api/index.js.map +1 -1
- package/dist/services/api/knowledge-candidate.js +44 -0
- package/dist/services/api/knowledge-candidate.js.map +1 -0
- package/dist/services/api/project-context.js +6 -1
- package/dist/services/api/project-context.js.map +1 -1
- package/dist/services/api/skill-sheet.js +5 -0
- package/dist/services/api/skill-sheet.js.map +1 -1
- package/dist/services/session/index.js +2 -3
- package/dist/services/session/index.js.map +1 -1
- package/dist/tool.js +12 -30
- package/dist/tool.js.map +1 -1
- package/docs/directory-submission.md +5 -5
- package/docs/privacy-policy.md +22 -12
- package/docs/reviewer-guide.md +13 -4
- package/docs/tools.md +31 -27
- package/docs/usage-examples.md +13 -12
- package/package.json +7 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { getRemoteKnowledgeCandidate, saveRemoteKnowledgeCandidate, } from '../../services/api/knowledge-candidate.js';
|
|
2
|
+
import { createMemo } from '../../services/api/memo.js';
|
|
3
3
|
export async function handleSavePendingCandidate(args, apiClient) {
|
|
4
4
|
if (!args || typeof args.candidate_id !== 'string') {
|
|
5
5
|
return {
|
|
@@ -7,11 +7,42 @@ export async function handleSavePendingCandidate(args, apiClient) {
|
|
|
7
7
|
isError: true,
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
return await saveRemoteCandidate(args, apiClient);
|
|
11
|
+
}
|
|
12
|
+
async function saveRemoteCandidate(args, apiClient) {
|
|
13
|
+
const candidate = await getRemoteKnowledgeCandidate(apiClient, args.candidate_id);
|
|
14
|
+
const suppliedMemoId = typeof args.saved_memo_id === 'number' ? args.saved_memo_id : undefined;
|
|
15
|
+
if (candidate.status !== 'pending') {
|
|
16
|
+
if (candidate.status === 'saved' &&
|
|
17
|
+
suppliedMemoId !== undefined &&
|
|
18
|
+
candidate.saved_memo_id === suppliedMemoId) {
|
|
19
|
+
const response = {
|
|
20
|
+
success: true,
|
|
21
|
+
action: 'saved',
|
|
22
|
+
candidate_id: candidate.id,
|
|
23
|
+
memo_id: suppliedMemoId,
|
|
24
|
+
title: candidate.title,
|
|
25
|
+
created_at: candidate.created_at,
|
|
26
|
+
created_at_source: 'saved_candidate',
|
|
27
|
+
used_existing_memo: true,
|
|
28
|
+
warnings: [],
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
structuredContent: response,
|
|
32
|
+
content: [
|
|
33
|
+
{
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: JSON.stringify(response, null, 2),
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
12
40
|
return {
|
|
13
41
|
content: [
|
|
14
|
-
{
|
|
42
|
+
{
|
|
43
|
+
type: 'text',
|
|
44
|
+
text: `Only pending candidates can be saved (current status: ${candidate.status})`,
|
|
45
|
+
},
|
|
15
46
|
],
|
|
16
47
|
isError: true,
|
|
17
48
|
};
|
|
@@ -51,40 +82,69 @@ export async function handleSavePendingCandidate(args, apiClient) {
|
|
|
51
82
|
memo_type_keys: memoTypeKeys,
|
|
52
83
|
projects,
|
|
53
84
|
};
|
|
54
|
-
|
|
55
|
-
if (
|
|
85
|
+
let memoId = suppliedMemoId;
|
|
86
|
+
if (memoId === undefined) {
|
|
87
|
+
const result = await createMemo(apiClient, params);
|
|
88
|
+
if (!result.success || result.id === undefined) {
|
|
89
|
+
return {
|
|
90
|
+
content: [
|
|
91
|
+
{
|
|
92
|
+
type: 'text',
|
|
93
|
+
text: `Failed to save knowledge candidate: ${result.error || 'Unknown error'}`,
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
isError: true,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
memoId = result.id;
|
|
100
|
+
}
|
|
101
|
+
let updated;
|
|
102
|
+
try {
|
|
103
|
+
updated = await saveRemoteKnowledgeCandidate(apiClient, {
|
|
104
|
+
candidate_id: candidate.id,
|
|
105
|
+
title,
|
|
106
|
+
body,
|
|
107
|
+
categories,
|
|
108
|
+
memo_type_keys: memoTypeKeys,
|
|
109
|
+
projects,
|
|
110
|
+
is_public: params.is_public,
|
|
111
|
+
saved_memo_id: memoId,
|
|
112
|
+
created_at: createdAt,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
const response = {
|
|
117
|
+
success: false,
|
|
118
|
+
action: 'save_candidate_failed_after_memo_created',
|
|
119
|
+
candidate_id: candidate.id,
|
|
120
|
+
memo_id: memoId,
|
|
121
|
+
title,
|
|
122
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
123
|
+
retry_args: {
|
|
124
|
+
candidate_id: candidate.id,
|
|
125
|
+
saved_memo_id: memoId,
|
|
126
|
+
},
|
|
127
|
+
};
|
|
56
128
|
return {
|
|
129
|
+
structuredContent: response,
|
|
57
130
|
content: [
|
|
58
131
|
{
|
|
59
132
|
type: 'text',
|
|
60
|
-
text:
|
|
133
|
+
text: JSON.stringify(response, null, 2),
|
|
61
134
|
},
|
|
62
135
|
],
|
|
63
136
|
isError: true,
|
|
64
137
|
};
|
|
65
138
|
}
|
|
66
|
-
const savedMemo = await findSavedMemo(apiClient, title, body);
|
|
67
|
-
const updated = updatePendingCandidate(candidate.id, (item) => ({
|
|
68
|
-
...item,
|
|
69
|
-
title,
|
|
70
|
-
body,
|
|
71
|
-
categories,
|
|
72
|
-
memo_type_keys: memoTypeKeys,
|
|
73
|
-
projects,
|
|
74
|
-
is_public: params.is_public,
|
|
75
|
-
status: 'saved',
|
|
76
|
-
fingerprint: createFingerprint(title, body),
|
|
77
|
-
saved_memo_id: savedMemo?.id,
|
|
78
|
-
updated_at: new Date().toISOString(),
|
|
79
|
-
}));
|
|
80
139
|
const response = {
|
|
81
140
|
success: true,
|
|
82
141
|
action: 'saved',
|
|
83
|
-
candidate_id: updated
|
|
84
|
-
memo_id:
|
|
142
|
+
candidate_id: updated.candidate_id,
|
|
143
|
+
memo_id: memoId ?? updated.memo_id ?? null,
|
|
85
144
|
title,
|
|
86
145
|
created_at: createdAt,
|
|
87
146
|
created_at_source: createdAtSource,
|
|
147
|
+
used_existing_memo: suppliedMemoId !== undefined,
|
|
88
148
|
warnings: createdAtSource === 'pending_created_at'
|
|
89
149
|
? [
|
|
90
150
|
'source_session_updated_at was not available; used pending candidate created_at',
|
|
@@ -101,11 +161,4 @@ export async function handleSavePendingCandidate(args, apiClient) {
|
|
|
101
161
|
],
|
|
102
162
|
};
|
|
103
163
|
}
|
|
104
|
-
async function findSavedMemo(apiClient, title, body) {
|
|
105
|
-
const result = await searchMemos(apiClient, { word: title, limit: 10 });
|
|
106
|
-
if (!result.success || !result.memos)
|
|
107
|
-
return undefined;
|
|
108
|
-
const fingerprint = createFingerprint(title, body);
|
|
109
|
-
return result.memos.find((memo) => createFingerprint(memo.title, memo.body) === fingerprint);
|
|
110
|
-
}
|
|
111
164
|
//# sourceMappingURL=handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/save-pending-candidate/handler.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/save-pending-candidate/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,10 @@ export const savePendingCandidateTool = {
|
|
|
7
7
|
type: 'object',
|
|
8
8
|
properties: {
|
|
9
9
|
candidate_id: { type: 'string', description: 'Candidate ID to save' },
|
|
10
|
+
saved_memo_id: {
|
|
11
|
+
type: 'number',
|
|
12
|
+
description: 'Existing memo ID to attach when retrying after memo creation succeeded but candidate save failed. Omit for normal saves.',
|
|
13
|
+
},
|
|
10
14
|
title: { type: 'string', description: 'Title override when saving' },
|
|
11
15
|
body: { type: 'string', description: 'Body override when saving' },
|
|
12
16
|
created_at: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/save-pending-candidate/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,CAAC,MAAM,wBAAwB,GAAgB;IACnD,UAAU,EAAE;QACV,IAAI,EAAE,8BAA8B;QACpC,WAAW,EACT,sIAAsI;QACxI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBACrE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;gBACpE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;gBAClE,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,+IAA+I;iBAClJ;gBACD,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACxD,cAAc,EAAE;oBACd,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC;qBAC1D;oBACD,WAAW,EACT,iKAAiK;iBACpK;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,8BAA8B;oBAC3C,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACtB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC1B;wBACD,QAAQ,EAAE,CAAC,IAAI,CAAC;qBACjB;iBACF;gBACD,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;aAC/C;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;KACF;IACD,OAAO,EAAE,0BAA0B;CACpC,CAAC"}
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/save-pending-candidate/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,CAAC,MAAM,wBAAwB,GAAgB;IACnD,UAAU,EAAE;QACV,IAAI,EAAE,8BAA8B;QACpC,WAAW,EACT,sIAAsI;QACxI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBACrE,aAAa,EAAE;oBACb,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,0HAA0H;iBAC7H;gBACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;gBACpE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;gBAClE,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,+IAA+I;iBAClJ;gBACD,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACxD,cAAc,EAAE;oBACd,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC;qBAC1D;oBACD,WAAW,EACT,iKAAiK;iBACpK;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,8BAA8B;oBAC3C,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACtB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC1B;wBACD,QAAQ,EAAE,CAAC,IAAI,CAAC;qBACjB;iBACF;gBACD,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;aAC/C;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;KACF;IACD,OAAO,EAAE,0BAA0B;CACpC,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { listRemoteProcessedSessions } from '../../services/api/knowledge-candidate.js';
|
|
1
2
|
import { scanSessions } from '../../services/session/index.js';
|
|
2
|
-
export async function handleScanSessions(args,
|
|
3
|
+
export async function handleScanSessions(args, apiClient) {
|
|
3
4
|
const sources = parseSources(args?.sources);
|
|
4
5
|
const includeProcessed = typeof args?.include_processed === 'boolean'
|
|
5
6
|
? args.include_processed
|
|
6
7
|
: false;
|
|
7
|
-
const
|
|
8
|
+
const processed = await listRemoteProcessedSessions(apiClient, sources.length === 1 ? sources[0] : undefined);
|
|
9
|
+
const sessions = scanSessions(sources, includeProcessed, processed.sessions);
|
|
8
10
|
const result = {
|
|
9
11
|
count: sessions.length,
|
|
10
12
|
sessions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/scan-sessions/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAyC,EACzC,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/scan-sessions/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAyC,EACzC,SAAoB;IAEpB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GACpB,OAAO,IAAI,EAAE,iBAAiB,KAAK,SAAS;QAC1C,CAAC,CAAC,IAAI,CAAC,iBAAiB;QACxB,CAAC,CAAC,KAAK,CAAC;IACZ,MAAM,SAAS,GAAG,MAAM,2BAA2B,CACjD,SAAS,EACT,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAC9C,CAAC;IACF,MAAM,QAAQ,GAAG,YAAY,CAC3B,OAAO,EACP,gBAAgB,EAChB,SAAS,CAAC,QAAQ,CACnB,CAAC;IACF,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,QAAQ;KACT,CAAC;IAEF,OAAO;QACL,iBAAiB,EAAE,MAAM;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,MAAM,EAA2B,EAAE,CAClC,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,CAC5C,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export async function handleUpdateCapturePolicy(args,
|
|
1
|
+
import { updateRemoteCapturePolicy } from '../../services/api/knowledge-candidate.js';
|
|
2
|
+
export async function handleUpdateCapturePolicy(args, apiClient) {
|
|
3
3
|
if (!args || typeof args.markdown !== 'string') {
|
|
4
4
|
return {
|
|
5
5
|
content: [{ type: 'text', text: 'markdown is required' }],
|
|
6
6
|
isError: true,
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
|
-
const policy =
|
|
9
|
+
const policy = await updateRemoteCapturePolicy(apiClient, args.markdown);
|
|
10
10
|
return {
|
|
11
11
|
structuredContent: policy,
|
|
12
12
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/update-capture-policy/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/update-capture-policy/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAyC,EACzC,SAAoB;IAEpB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;YACzD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEzE,OAAO;QACL,iBAAiB,EAAE,MAA4C;QAC/D,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -2,13 +2,13 @@ import { handleUpdateCapturePolicy } from './handler.js';
|
|
|
2
2
|
export const updateCapturePolicyTool = {
|
|
3
3
|
definition: {
|
|
4
4
|
name: 'paput_update_capture_policy',
|
|
5
|
-
description: 'Save the
|
|
5
|
+
description: 'Save the PaPut capture policy document generated by the client AI from discarded knowledge candidates.',
|
|
6
6
|
inputSchema: {
|
|
7
7
|
type: 'object',
|
|
8
8
|
properties: {
|
|
9
9
|
markdown: {
|
|
10
10
|
type: 'string',
|
|
11
|
-
description: 'Capture policy markdown to save
|
|
11
|
+
description: 'Capture policy markdown to save.',
|
|
12
12
|
},
|
|
13
13
|
},
|
|
14
14
|
required: ['markdown'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/update-capture-policy/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,uBAAuB,GAAgB;IAClD,UAAU,EAAE;QACV,IAAI,EAAE,6BAA6B;QACnC,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/update-capture-policy/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,uBAAuB,GAAgB;IAClD,UAAU,EAAE;QACV,IAAI,EAAE,6BAA6B;QACnC,WAAW,EACT,wGAAwG;QAC1G,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;iBAChD;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB;KACF;IACD,OAAO,EAAE,yBAAyB;CACnC,CAAC"}
|
|
@@ -50,8 +50,8 @@ export async function handleUpdateMemo(args, apiClient, context) {
|
|
|
50
50
|
if (Array.isArray(args.memo_type_keys)) {
|
|
51
51
|
params.memo_type_keys = args.memo_type_keys.filter((key) => typeof key === 'string');
|
|
52
52
|
}
|
|
53
|
-
params.projects = await resolveMemoProjects(args, apiClient, context);
|
|
54
53
|
try {
|
|
54
|
+
params.projects = await resolveMemoProjects(args, apiClient, context);
|
|
55
55
|
const result = await updateMemo(apiClient, params);
|
|
56
56
|
if (!result.success) {
|
|
57
57
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/update-memo/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAyC,EACzC,SAAoB,EACpB,OAAqB;IAErB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qBAAqB;iBAC5B;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IACE,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAC3B,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAC9B,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAC7B,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,EACnC,CAAC;QACD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,wDAAwD;iBAC/D;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAmC,EAAE,CAAC;IACtD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC7D,MAAM,QAAQ,GAAsC;oBAClD,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;iBACvB,CAAC;gBACF,IAAI,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;oBAC9C,QAAQ,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;gBACvB,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAqB;QAC/B,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU;KACX,CAAC;IAEF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAChD,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAChD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/update-memo/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export async function handleUpdatePendingCandidate(args,
|
|
1
|
+
import { updateRemoteKnowledgeCandidate } from '../../services/api/knowledge-candidate.js';
|
|
2
|
+
export async function handleUpdatePendingCandidate(args, apiClient) {
|
|
3
3
|
if (!args || typeof args.candidate_id !== 'string') {
|
|
4
4
|
return {
|
|
5
5
|
content: [{ type: 'text', text: 'candidate_id is required' }],
|
|
6
6
|
isError: true,
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
|
-
const candidate = readCache().pending.find((item) => item.id === args.candidate_id);
|
|
10
|
-
if (!candidate) {
|
|
11
|
-
return {
|
|
12
|
-
content: [
|
|
13
|
-
{ type: 'text', text: 'Pending candidate to update was not found' },
|
|
14
|
-
],
|
|
15
|
-
isError: true,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
if (candidate.status !== 'pending') {
|
|
19
|
-
return {
|
|
20
|
-
content: [
|
|
21
|
-
{
|
|
22
|
-
type: 'text',
|
|
23
|
-
text: `Only pending candidates can be updated (current status: ${candidate.status})`,
|
|
24
|
-
},
|
|
25
|
-
],
|
|
26
|
-
isError: true,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
9
|
const patch = buildPatch(args);
|
|
30
10
|
if ('error' in patch) {
|
|
31
11
|
return {
|
|
@@ -44,23 +24,10 @@ export async function handleUpdatePendingCandidate(args, _apiClient) {
|
|
|
44
24
|
isError: true,
|
|
45
25
|
};
|
|
46
26
|
}
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
...item,
|
|
51
|
-
...patch.fields,
|
|
52
|
-
updated_at: new Date().toISOString(),
|
|
53
|
-
};
|
|
54
|
-
next.fingerprint = createFingerprint(next.title, next.body);
|
|
55
|
-
return next;
|
|
27
|
+
const result = await updateRemoteKnowledgeCandidate(apiClient, {
|
|
28
|
+
candidate_id: args.candidate_id,
|
|
29
|
+
...patch.fields,
|
|
56
30
|
});
|
|
57
|
-
const result = {
|
|
58
|
-
updated: true,
|
|
59
|
-
candidate_id: updated?.id,
|
|
60
|
-
title: updated?.title,
|
|
61
|
-
changed_fields: changedFields,
|
|
62
|
-
candidate: updated,
|
|
63
|
-
};
|
|
64
31
|
return {
|
|
65
32
|
structuredContent: result,
|
|
66
33
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/update-pending-candidate/handler.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/update-pending-candidate/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { handleUpdatePendingCandidate } from './handler.js';
|
|
|
2
2
|
export const updatePendingCandidateTool = {
|
|
3
3
|
definition: {
|
|
4
4
|
name: 'paput_update_pending_candidate',
|
|
5
|
-
description: 'Update an existing pending knowledge candidate
|
|
5
|
+
description: 'Update an existing pending knowledge candidate before it is saved to PaPut. Only fields you provide are changed; omitted fields keep their current value. Use this to refine a candidate (title, body, categories, memo type keys, confidence, visibility, or linked projects) instead of discarding and re-adding it. Only candidates that are still pending can be updated.',
|
|
6
6
|
inputSchema: {
|
|
7
7
|
type: 'object',
|
|
8
8
|
properties: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/update-pending-candidate/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,MAAM,0BAA0B,GAAgB;IACrD,UAAU,EAAE;QACV,IAAI,EAAE,gCAAgC;QACtC,WAAW,EACT
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/update-pending-candidate/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,MAAM,0BAA0B,GAAgB;IACrD,UAAU,EAAE;QACV,IAAI,EAAE,gCAAgC;QACtC,WAAW,EACT,+WAA+W;QACjX,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;gBAC3D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;gBACzD,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,WAAW,EAAE,4BAA4B;iBAC1C;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC;qBAC1D;oBACD,WAAW,EACT,4IAA4I;iBAC/I;gBACD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;gBAC/D,SAAS,EAAE;oBACT,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,uCAAuC;iBACrD;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,6BAA6B;oBAC1C,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACtB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC1B;wBACD,QAAQ,EAAE,CAAC,IAAI,CAAC;qBACjB;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,cAAc,CAAC;SAC3B;KACF;IACD,OAAO,EAAE,4BAA4B;CACtC,CAAC"}
|
|
@@ -85,6 +85,9 @@ function parseProjectParams(params) {
|
|
|
85
85
|
if (typeof params.end_period === 'string' || params.end_period === null) {
|
|
86
86
|
project.end_period = params.end_period;
|
|
87
87
|
}
|
|
88
|
+
if (typeof params.mcp_alias === 'string') {
|
|
89
|
+
project.mcp_alias = params.mcp_alias;
|
|
90
|
+
}
|
|
88
91
|
return project;
|
|
89
92
|
}
|
|
90
93
|
function isTechnology(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/upsert-skill-sheet-project/handler.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAA2C,EAC3C,SAAoB;IAEpB,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,mCAAmC;iBAC1C;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GACN,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAC5B,CAAC,CAAC,OAAO,CAAC,EAAE;QACZ,CAAC,CAAC,MAAM,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE5D,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,uBAAuB,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7D,OAAO;YACL,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE;YACpE,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,wBAAwB,EAAE,EAAE;iBACnC;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEhE,OAAO;QACL,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC1E,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,sBAAsB,QAAQ,CAAC,KAAK,SAAS,QAAQ,CAAC,EAAE,GAAG;aAClE;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,SAAoB,EACpB,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9E,OAAO,UAAU,EAAE,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,kBAAkB,CACzB,MAA2C;IAE3C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IACE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAChC,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ;QACvC,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;QACtC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAChC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;QACnC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;QAChC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CACvC,CAAC,OAAO,EAAqB,EAAE,CAAC,OAAO,OAAO,KAAK,QAAQ,CAC5D,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEpD,IACE,YAAY,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,CAAC,MAAM;QAClD,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM;QAC5C,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,EACpC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAkC;QAC7C,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY;QACZ,SAAS;QACT,KAAK;KACN,CAAC;IAEF,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACxE,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CACnD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,IAAI,IAAI,KAAK;QACb,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAChC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/handlers/upsert-skill-sheet-project/handler.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAA2C,EAC3C,SAAoB;IAEpB,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,mCAAmC;iBAC1C;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GACN,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAC5B,CAAC,CAAC,OAAO,CAAC,EAAE;QACZ,CAAC,CAAC,MAAM,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE5D,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,uBAAuB,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7D,OAAO;YACL,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE;YACpE,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,wBAAwB,EAAE,EAAE;iBACnC;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEhE,OAAO;QACL,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC1E,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,sBAAsB,QAAQ,CAAC,KAAK,SAAS,QAAQ,CAAC,EAAE,GAAG;aAClE;SACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,SAAoB,EACpB,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9E,OAAO,UAAU,EAAE,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,kBAAkB,CACzB,MAA2C;IAE3C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IACE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAChC,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ;QACvC,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;QACtC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAChC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;QACnC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;QAChC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CACvC,CAAC,OAAO,EAAqB,EAAE,CAAC,OAAO,OAAO,KAAK,QAAQ,CAC5D,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEpD,IACE,YAAY,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,CAAC,MAAM;QAClD,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM;QAC5C,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,EACpC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAkC;QAC7C,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY;QACZ,SAAS;QACT,KAAK;KACN,CAAC;IAEF,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACxE,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACvC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CACnD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,IAAI,IAAI,KAAK;QACb,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAChC,CAAC;AACJ,CAAC"}
|
|
@@ -18,6 +18,10 @@ export const upsertSkillSheetProjectTool = {
|
|
|
18
18
|
type: 'string',
|
|
19
19
|
description: 'Project title',
|
|
20
20
|
},
|
|
21
|
+
mcp_alias: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'Project alias used in remote MCP URLs. Use 3-40 lowercase alphanumeric characters, e.g. paput.',
|
|
24
|
+
},
|
|
21
25
|
start_period: {
|
|
22
26
|
type: 'string',
|
|
23
27
|
description: 'Start period in YYYY-MM format',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/upsert-skill-sheet-project/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,2BAA2B,GAAgB;IACtD,UAAU,EAAE;QACV,IAAI,EAAE,kCAAkC;QACxC,WAAW,EACT,sJAAsJ;QACxJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE;oBACF,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,yDAAyD;iBAC5D;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sCAAsC;iBACpD;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,eAAe;iBAC7B;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;iBAC5C;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qBAAqB;iBACnC;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,MAAM;iBACpB;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uBAAuB;iBACrC;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,mBAAmB;oBAChC,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,0CAA0C;6BACxD;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,iBAAiB;6BAC/B;yBACF;wBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;qBACnB;iBACF;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,wHAAwH;oBAC1H,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;qBACf;iBACF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,eAAe;oBAC5B,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,SAAS;6BACvB;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,YAAY;6BAC1B;yBACF;wBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;qBAC1B;iBACF;aACF;YACD,QAAQ,EAAE;gBACR,MAAM;gBACN,OAAO;gBACP,cAAc;gBACd,aAAa;gBACb,MAAM;gBACN,OAAO;gBACP,cAAc;gBACd,WAAW;gBACX,OAAO;aACR;SACF;KACF;IACD,OAAO;CACR,CAAC"}
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/handlers/upsert-skill-sheet-project/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,2BAA2B,GAAgB;IACtD,UAAU,EAAE;QACV,IAAI,EAAE,kCAAkC;QACxC,WAAW,EACT,sJAAsJ;QACxJ,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE;oBACF,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,yDAAyD;iBAC5D;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sCAAsC;iBACpD;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,eAAe;iBAC7B;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,gGAAgG;iBACnG;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gCAAgC;iBAC9C;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8BAA8B;iBAC5C;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qBAAqB;iBACnC;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,MAAM;iBACpB;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uBAAuB;iBACrC;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,mBAAmB;oBAChC,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,0CAA0C;6BACxD;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,iBAAiB;6BAC/B;yBACF;wBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;qBACnB;iBACF;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,wHAAwH;oBAC1H,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;qBACf;iBACF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,eAAe;oBAC5B,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE;gCACF,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,SAAS;6BACvB;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,YAAY;6BAC1B;yBACF;wBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;qBAC1B;iBACF;aACF;YACD,QAAQ,EAAE;gBACR,MAAM;gBACN,OAAO;gBACP,cAAc;gBACd,aAAa;gBACb,MAAM;gBACN,OAAO;gBACP,cAAc;gBACd,WAAW;gBACX,OAAO;aACR;SACF;KACF;IACD,OAAO;CACR,CAAC"}
|
package/dist/http.js
CHANGED
|
@@ -3,6 +3,7 @@ import { createServer, } from 'node:http';
|
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
5
5
|
import { createMcpServer } from './server.js';
|
|
6
|
+
import { createApiClient, getSkillSheetProjectByAlias, } from './services/api/index.js';
|
|
6
7
|
const OAUTH_SCOPES = ['paput.read', 'paput.write'];
|
|
7
8
|
const MAX_REQUEST_BODY_BYTES = 5 * 1024 * 1024;
|
|
8
9
|
const FRONT_ORIGIN = 'https://paput.io';
|
|
@@ -15,7 +16,7 @@ const ICON_SOURCES = {
|
|
|
15
16
|
'/icon.svg': '/icon.svg',
|
|
16
17
|
};
|
|
17
18
|
export async function startHttpMcpServer(options = {}) {
|
|
18
|
-
const endpoint = options.endpoint ?? '/';
|
|
19
|
+
const endpoint = normalizeEndpoint(options.endpoint ?? '/mcp');
|
|
19
20
|
const port = options.port ?? Number(process.env.PORT ?? 3000);
|
|
20
21
|
// host 未指定は 0.0.0.0 全開放。ローカル開発では HOST=127.0.0.1 を渡すこと。
|
|
21
22
|
const host = options.host ?? process.env.HOST;
|
|
@@ -41,8 +42,8 @@ export async function startHttpMcpServer(options = {}) {
|
|
|
41
42
|
async function handleHttpRequest(req, res) {
|
|
42
43
|
const requestUrl = new URL(req.url ?? '/', `http://${normalizeHostHeader(req.headers.host)}`);
|
|
43
44
|
const publicOrigin = getPublicOrigin(req, requestUrl);
|
|
44
|
-
const
|
|
45
|
-
const protectedResourceMetadataUrl = getProtectedResourceMetadataUrl(publicOrigin
|
|
45
|
+
const effectiveEndpoint = resolveEndpoint(requestUrl.pathname, endpoint);
|
|
46
|
+
const protectedResourceMetadataUrl = getProtectedResourceMetadataUrl(publicOrigin);
|
|
46
47
|
if (requestUrl.pathname === '/healthz') {
|
|
47
48
|
res.writeHead(200, { 'content-type': 'application/json' });
|
|
48
49
|
res.end(JSON.stringify({ ok: true }));
|
|
@@ -57,9 +58,10 @@ export async function startHttpMcpServer(options = {}) {
|
|
|
57
58
|
await serveIcon(res, `${FRONT_ORIGIN}${iconPath}`);
|
|
58
59
|
return;
|
|
59
60
|
}
|
|
60
|
-
if (requestUrl.pathname === '/.well-known/oauth-protected-resource'
|
|
61
|
+
if (requestUrl.pathname === '/.well-known/oauth-protected-resource' ||
|
|
62
|
+
requestUrl.pathname.startsWith('/.well-known/oauth-protected-resource/')) {
|
|
61
63
|
sendJson(res, 200, {
|
|
62
|
-
resource:
|
|
64
|
+
resource: getResourceUrl(publicOrigin, endpoint),
|
|
63
65
|
resource_name: 'PaPut',
|
|
64
66
|
authorization_servers: [apiOrigin],
|
|
65
67
|
scopes_supported: OAUTH_SCOPES,
|
|
@@ -74,16 +76,17 @@ export async function startHttpMcpServer(options = {}) {
|
|
|
74
76
|
res.end();
|
|
75
77
|
return;
|
|
76
78
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
// 公開ランディングはクローラー向けにも 200 を返す。SSE GET と MCP POST は下の origin 検査を通す。
|
|
82
|
-
if ((req.method === 'GET' || req.method === 'HEAD') &&
|
|
79
|
+
// 公開案内ページはクローラー向けにも 200 を返す。MCP endpoint ではない。
|
|
80
|
+
if (requestUrl.pathname === '/' &&
|
|
81
|
+
(req.method === 'GET' || req.method === 'HEAD') &&
|
|
83
82
|
!requestsEventStream(req)) {
|
|
84
83
|
sendLandingPage(res, req.method === 'HEAD');
|
|
85
84
|
return;
|
|
86
85
|
}
|
|
86
|
+
if (!effectiveEndpoint) {
|
|
87
|
+
sendJsonRpcError(res, 404, -32000, 'Not found');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
87
90
|
if (!isAllowedOrigin(req, publicOrigin, apiOrigin, configuredAllowedOrigins)) {
|
|
88
91
|
sendJsonRpcError(res, 403, -32000, 'Forbidden origin.');
|
|
89
92
|
return;
|
|
@@ -115,11 +118,23 @@ export async function startHttpMcpServer(options = {}) {
|
|
|
115
118
|
sendJsonRpcError(res, 400, -32000, 'Bad request');
|
|
116
119
|
return;
|
|
117
120
|
}
|
|
121
|
+
const projectAlias = normalizeProjectAlias(requestUrl.searchParams.get('project_alias') ??
|
|
122
|
+
requestUrl.searchParams.get('alias'));
|
|
123
|
+
if (projectAlias === false) {
|
|
124
|
+
sendJsonRpcError(res, 400, -32602, 'project_alias must be 3-40 lowercase alphanumeric characters.');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const projectContext = await resolveProjectContext(apiUrl, accessToken, projectAlias);
|
|
128
|
+
if (projectContext === false) {
|
|
129
|
+
sendJsonRpcError(res, 404, -32000, 'project_alias was not found.');
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
118
132
|
const mcpServer = createMcpServer({
|
|
119
133
|
...options,
|
|
120
134
|
accessToken,
|
|
121
|
-
|
|
122
|
-
|
|
135
|
+
projectId: projectContext?.projectId ?? options.projectId,
|
|
136
|
+
projectTitle: projectContext?.projectTitle ?? options.projectTitle,
|
|
137
|
+
projectAlias: projectContext?.projectAlias ?? options.projectAlias,
|
|
123
138
|
});
|
|
124
139
|
const transport = new StreamableHTTPServerTransport({
|
|
125
140
|
sessionIdGenerator: undefined,
|
|
@@ -155,6 +170,38 @@ export async function startHttpMcpServer(options = {}) {
|
|
|
155
170
|
});
|
|
156
171
|
return httpServer;
|
|
157
172
|
}
|
|
173
|
+
function normalizeEndpoint(endpoint) {
|
|
174
|
+
const trimmed = endpoint.trim();
|
|
175
|
+
if (!trimmed || trimmed === '/')
|
|
176
|
+
return '/';
|
|
177
|
+
return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
178
|
+
}
|
|
179
|
+
function resolveEndpoint(pathname, endpoint) {
|
|
180
|
+
if (pathname === endpoint)
|
|
181
|
+
return endpoint;
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
function normalizeProjectAlias(value) {
|
|
185
|
+
const alias = value?.trim() ?? '';
|
|
186
|
+
if (!alias)
|
|
187
|
+
return null;
|
|
188
|
+
if (!/^[a-z0-9]{3,40}$/.test(alias))
|
|
189
|
+
return false;
|
|
190
|
+
return alias;
|
|
191
|
+
}
|
|
192
|
+
async function resolveProjectContext(apiUrl, accessToken, projectAlias) {
|
|
193
|
+
if (!projectAlias)
|
|
194
|
+
return null;
|
|
195
|
+
const apiClient = createApiClient(apiUrl, accessToken);
|
|
196
|
+
const project = await getSkillSheetProjectByAlias(apiClient, projectAlias);
|
|
197
|
+
if (!project)
|
|
198
|
+
return false;
|
|
199
|
+
return {
|
|
200
|
+
projectId: project.id,
|
|
201
|
+
projectTitle: project.title,
|
|
202
|
+
projectAlias,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
158
205
|
function parseAllowedOrigins(value) {
|
|
159
206
|
return (value ?? '')
|
|
160
207
|
.split(',')
|
|
@@ -182,9 +229,10 @@ function sendLandingPage(res, headOnly = false) {
|
|
|
182
229
|
<body>
|
|
183
230
|
<h1>PaPut MCP Server</h1>
|
|
184
231
|
<p>
|
|
185
|
-
This is the remote Model Context Protocol
|
|
186
|
-
<a href="https://paput.io">PaPut</a>. MCP clients
|
|
187
|
-
|
|
232
|
+
This is the remote Model Context Protocol server for
|
|
233
|
+
<a href="https://paput.io">PaPut</a>. MCP clients should use
|
|
234
|
+
<code>https://mcp.paput.io/mcp</code> and connect over HTTP POST with OAuth.
|
|
235
|
+
See <a href="https://github.com/mizulba-dev/paput-mcp">the documentation</a>.
|
|
188
236
|
</p>
|
|
189
237
|
</body>
|
|
190
238
|
</html>
|
|
@@ -279,10 +327,8 @@ function getPublicOrigin(req, requestUrl) {
|
|
|
279
327
|
function getResourceUrl(publicOrigin, endpoint) {
|
|
280
328
|
return endpoint === '/' ? publicOrigin : `${publicOrigin}${endpoint}`;
|
|
281
329
|
}
|
|
282
|
-
function getProtectedResourceMetadataUrl(publicOrigin
|
|
283
|
-
return
|
|
284
|
-
? `${publicOrigin}/.well-known/oauth-protected-resource`
|
|
285
|
-
: `${publicOrigin}/.well-known/oauth-protected-resource${endpoint}`;
|
|
330
|
+
function getProtectedResourceMetadataUrl(publicOrigin) {
|
|
331
|
+
return `${publicOrigin}/.well-known/oauth-protected-resource`;
|
|
286
332
|
}
|
|
287
333
|
function extractBearerToken(authorizationHeader) {
|
|
288
334
|
if (!authorizationHeader?.toLowerCase().startsWith('bearer ')) {
|
|
@@ -361,7 +407,7 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
361
407
|
? `${address.address}:${address.port}`
|
|
362
408
|
: String(address);
|
|
363
409
|
console.error(`PaPut MCP Streamable HTTP server listening on ${listeningOn}`);
|
|
364
|
-
console.error('MCP endpoint: /');
|
|
410
|
+
console.error('MCP endpoint: /mcp');
|
|
365
411
|
})
|
|
366
412
|
.catch((error) => {
|
|
367
413
|
console.error('Unexpected error:', error);
|