tripinned-mcp 1.0.5 → 1.0.7
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.js +109 -24
- package/package.json +29 -27
package/dist/index.js
CHANGED
|
@@ -83,27 +83,69 @@ server.tool("update_trip", "여행 플랜 정보를 수정합니다. 변경할
|
|
|
83
83
|
});
|
|
84
84
|
server.tool("delete_trip", "여행 플랜을 삭제합니다. 포함된 모든 Day와 일정도 함께 삭제됩니다.", { trip_id: z.string().describe("플랜 ID") }, async ({ trip_id }) => {
|
|
85
85
|
await call("DELETE", `/trips/${trip_id}`);
|
|
86
|
-
return {
|
|
86
|
+
return {
|
|
87
|
+
content: [
|
|
88
|
+
{ type: "text", text: `플랜 ${trip_id}이(가) 삭제되었습니다.` },
|
|
89
|
+
],
|
|
90
|
+
};
|
|
87
91
|
});
|
|
88
92
|
// ── Items ────────────────────────────────────────────────────────────────────
|
|
89
93
|
server.tool("add_item", `특정 Day에 일정을 추가합니다. Day당 최대 ${ITEM_PER_DAY_LIMIT}개까지 추가 가능합니다.`, {
|
|
90
94
|
trip_id: z.string().describe("플랜 ID"),
|
|
91
95
|
day_id: z.string().describe("Day ID (get_trip으로 확인 가능)"),
|
|
92
96
|
title: z.string().max(50).describe("일정 제목 (최대 50자)"),
|
|
93
|
-
icon: z
|
|
94
|
-
|
|
95
|
-
"
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
icon: z
|
|
98
|
+
.enum([
|
|
99
|
+
"FOOD",
|
|
100
|
+
"CAFE",
|
|
101
|
+
"HOTEL",
|
|
102
|
+
"SIGHTSEEING",
|
|
103
|
+
"SHOPPING",
|
|
104
|
+
"ACTIVITY",
|
|
105
|
+
"ETC",
|
|
106
|
+
"TRANSPORT",
|
|
107
|
+
"PLANE",
|
|
108
|
+
"TRAIN",
|
|
109
|
+
"BUS",
|
|
110
|
+
"CAR",
|
|
111
|
+
"BOAT",
|
|
112
|
+
"WALK",
|
|
113
|
+
"TRANSPORT_ETC",
|
|
114
|
+
])
|
|
115
|
+
.optional()
|
|
116
|
+
.describe("아이콘 종류 (기본값: ETC)"),
|
|
117
|
+
start_time: z
|
|
118
|
+
.string()
|
|
119
|
+
.regex(/^\d{2}:\d{2}$/)
|
|
120
|
+
.optional()
|
|
121
|
+
.describe("시작 시간 (HH:MM)"),
|
|
122
|
+
end_time: z
|
|
123
|
+
.string()
|
|
124
|
+
.regex(/^\d{2}:\d{2}$/)
|
|
125
|
+
.optional()
|
|
126
|
+
.describe("종료 시간 (HH:MM)"),
|
|
127
|
+
end_day_offset: z.coerce
|
|
128
|
+
.number()
|
|
129
|
+
.int()
|
|
130
|
+
.min(0)
|
|
131
|
+
.optional()
|
|
132
|
+
.describe("도착일 오프셋 (0=당일, 1=다음날 등)"),
|
|
100
133
|
place: z.string().optional().describe("장소명"),
|
|
101
134
|
memo: z.string().max(1000).optional().describe("메모 (최대 1000자)"),
|
|
102
|
-
from_place: z
|
|
103
|
-
|
|
104
|
-
|
|
135
|
+
from_place: z
|
|
136
|
+
.string()
|
|
137
|
+
.optional()
|
|
138
|
+
.describe("출발지 IATA 코드 (항공편 전용, 예: ICN)"),
|
|
139
|
+
to_place: z
|
|
140
|
+
.string()
|
|
141
|
+
.optional()
|
|
142
|
+
.describe("도착지 IATA 코드 (항공편 전용, 예: MXP)"),
|
|
143
|
+
layovers: z
|
|
144
|
+
.string()
|
|
145
|
+
.optional()
|
|
146
|
+
.describe('경유지 JSON 배열 (항공편 전용). 필드: iata, tz, arrTime(HH:MM), arrOffset, depTime(HH:MM), depOffset, depFlightNo?, airportChange?, depIata?, depTz?'),
|
|
105
147
|
flight_no: z.string().optional().describe("항공편 번호 (예: KE447)"),
|
|
106
|
-
}, async ({ trip_id, day_id, title, icon, start_time, end_time, end_day_offset, place, memo, from_place, to_place, layovers, flight_no }) => {
|
|
148
|
+
}, async ({ trip_id, day_id, title, icon, start_time, end_time, end_day_offset, place, memo, from_place, to_place, layovers, flight_no, }) => {
|
|
107
149
|
const body = { title };
|
|
108
150
|
if (icon)
|
|
109
151
|
body.icon = icon;
|
|
@@ -133,20 +175,59 @@ server.tool("update_item", "일정을 수정합니다. 변경할 필드만 보
|
|
|
133
175
|
day_id: z.string().describe("Day ID"),
|
|
134
176
|
item_id: z.string().describe("일정 ID"),
|
|
135
177
|
title: z.string().max(50).optional().describe("새 제목"),
|
|
136
|
-
icon: z
|
|
137
|
-
|
|
138
|
-
"
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
178
|
+
icon: z
|
|
179
|
+
.enum([
|
|
180
|
+
"FOOD",
|
|
181
|
+
"CAFE",
|
|
182
|
+
"HOTEL",
|
|
183
|
+
"SIGHTSEEING",
|
|
184
|
+
"SHOPPING",
|
|
185
|
+
"ACTIVITY",
|
|
186
|
+
"ETC",
|
|
187
|
+
"TRANSPORT",
|
|
188
|
+
"PLANE",
|
|
189
|
+
"TRAIN",
|
|
190
|
+
"BUS",
|
|
191
|
+
"CAR",
|
|
192
|
+
"BOAT",
|
|
193
|
+
"WALK",
|
|
194
|
+
"TRANSPORT_ETC",
|
|
195
|
+
])
|
|
196
|
+
.optional()
|
|
197
|
+
.describe("새 아이콘"),
|
|
198
|
+
start_time: z
|
|
199
|
+
.string()
|
|
200
|
+
.regex(/^\d{2}:\d{2}$/)
|
|
201
|
+
.optional()
|
|
202
|
+
.describe("새 시작 시간 (HH:MM)"),
|
|
203
|
+
end_time: z
|
|
204
|
+
.string()
|
|
205
|
+
.regex(/^\d{2}:\d{2}$/)
|
|
206
|
+
.optional()
|
|
207
|
+
.describe("새 종료 시간 (HH:MM)"),
|
|
208
|
+
end_day_offset: z.coerce
|
|
209
|
+
.number()
|
|
210
|
+
.int()
|
|
211
|
+
.min(0)
|
|
212
|
+
.optional()
|
|
213
|
+
.describe("도착일 오프셋 (0=당일, 1=다음날 등)"),
|
|
143
214
|
place: z.string().optional().describe("새 장소명"),
|
|
144
215
|
memo: z.string().max(1000).optional().describe("새 메모"),
|
|
145
|
-
from_place: z
|
|
146
|
-
|
|
147
|
-
|
|
216
|
+
from_place: z
|
|
217
|
+
.string()
|
|
218
|
+
.optional()
|
|
219
|
+
.describe("출발지 IATA 코드 (항공편 전용, 예: ICN)"),
|
|
220
|
+
to_place: z
|
|
221
|
+
.string()
|
|
222
|
+
.optional()
|
|
223
|
+
.describe("도착지 IATA 코드 (항공편 전용, 예: MXP)"),
|
|
224
|
+
layovers: z
|
|
225
|
+
.string()
|
|
226
|
+
.nullable()
|
|
227
|
+
.optional()
|
|
228
|
+
.describe('경유지 JSON 배열 (항공편 전용). 필드: iata, tz, arrTime(HH:MM), arrOffset, depTime(HH:MM), depOffset, depFlightNo?, airportChange?, depIata?, depTz?. null로 초기화 가능'),
|
|
148
229
|
flight_no: z.string().optional().describe("항공편 번호 (예: KE447)"),
|
|
149
|
-
}, async ({ trip_id, day_id, item_id, title, icon, start_time, end_time, end_day_offset, place, memo, from_place, to_place, layovers, flight_no }) => {
|
|
230
|
+
}, async ({ trip_id, day_id, item_id, title, icon, start_time, end_time, end_day_offset, place, memo, from_place, to_place, layovers, flight_no, }) => {
|
|
150
231
|
const body = {};
|
|
151
232
|
if (title !== undefined)
|
|
152
233
|
body.title = title;
|
|
@@ -179,7 +260,11 @@ server.tool("delete_item", "일정을 삭제합니다.", {
|
|
|
179
260
|
item_id: z.string().describe("일정 ID"),
|
|
180
261
|
}, async ({ trip_id, day_id, item_id }) => {
|
|
181
262
|
await call("DELETE", `/trips/${trip_id}/days/${day_id}/items/${item_id}`);
|
|
182
|
-
return {
|
|
263
|
+
return {
|
|
264
|
+
content: [
|
|
265
|
+
{ type: "text", text: `일정 ${item_id}이(가) 삭제되었습니다.` },
|
|
266
|
+
],
|
|
267
|
+
};
|
|
183
268
|
});
|
|
184
269
|
// ── Start ─────────────────────────────────────────────────────────────────────
|
|
185
270
|
const transport = new StdioServerTransport();
|
package/package.json
CHANGED
|
@@ -1,27 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "tripinned-mcp",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "MCP server for Tripinned — manage your travel plans with AI",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"tripinned-mcp": "dist/index.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "tripinned-mcp",
|
|
3
|
+
"version": "1.0.7",
|
|
4
|
+
"description": "MCP server for Tripinned — manage your travel plans with AI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"tripinned-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "node --loader ts-node/esm src/index.ts",
|
|
16
|
+
"start": "node dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
20
|
+
"zod": "^4.3.6"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^25.5.0",
|
|
24
|
+
"typescript": "^5.0.0"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
}
|
|
29
|
+
}
|