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.
Files changed (2) hide show
  1. package/dist/index.js +109 -24
  2. 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 { content: [{ type: "text", text: `플랜 ${trip_id}이(가) 삭제되었습니다.` }] };
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.enum([
94
- "FOOD", "CAFE", "HOTEL", "SIGHTSEEING", "SHOPPING", "ACTIVITY", "ETC",
95
- "TRANSPORT", "PLANE", "TRAIN", "BUS", "CAR", "BOAT", "WALK", "TRANSPORT_ETC",
96
- ]).optional().describe("아이콘 종류 (기본값: ETC)"),
97
- start_time: z.string().regex(/^\d{2}:\d{2}$/).optional().describe("시작 시간 (HH:MM)"),
98
- end_time: z.string().regex(/^\d{2}:\d{2}$/).optional().describe("종료 시간 (HH:MM)"),
99
- end_day_offset: z.coerce.number().int().min(0).optional().describe("도착일 오프셋 (0=당일, 1=다음날 등)"),
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.string().optional().describe("출발지 IATA 코드 (항공편 전용, 예: ICN)"),
103
- to_place: z.string().optional().describe("도착지 IATA 코드 (항공편 전용, 예: MXP)"),
104
- layovers: z.string().optional().describe('경유지 JSON 배열 (항공편 전용). 각 경유지 필드: iata(도착공항), tz(타임존), arrTime(도착시간HH:MM), arrOffset(도착일오프셋), depTime(출발시간HH:MM), depOffset(출발일오프셋), depFlightNo?(출발편명), airportChange?(공항변경/스탑오버여부), depIata?(출발공항IATA, airportChange=true일때), depTz?(출발공항타임존). 예: [{"iata":"DMK","tz":"Asia/Bangkok","arrTime":"23:00","arrOffset":0,"depTime":"06:00","depOffset":1,"airportChange":true,"depIata":"BKK","depTz":"Asia/Bangkok"}]'),
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.enum([
137
- "FOOD", "CAFE", "HOTEL", "SIGHTSEEING", "SHOPPING", "ACTIVITY", "ETC",
138
- "TRANSPORT", "PLANE", "TRAIN", "BUS", "CAR", "BOAT", "WALK", "TRANSPORT_ETC",
139
- ]).optional().describe("새 아이콘"),
140
- start_time: z.string().regex(/^\d{2}:\d{2}$/).optional().describe("새 시작 시간 (HH:MM)"),
141
- end_time: z.string().regex(/^\d{2}:\d{2}$/).optional().describe("새 종료 시간 (HH:MM)"),
142
- end_day_offset: z.coerce.number().int().min(0).optional().describe("도착일 오프셋 (0=당일, 1=다음날 등)"),
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.string().optional().describe("출발지 IATA 코드 (항공편 전용, 예: ICN)"),
146
- to_place: z.string().optional().describe("도착지 IATA 코드 (항공편 전용, 예: MXP)"),
147
- layovers: z.string().nullable().optional().describe('경유지 JSON 배열 (항공편 전용). 각 경유지 필드: iata(도착공항), tz(타임존), arrTime(도착시간HH:MM), arrOffset(도착일오프셋), depTime(출발시간HH:MM), depOffset(출발일오프셋), depFlightNo?(출발편명), airportChange?(공항변경/스탑오버여부), depIata?(출발공항IATA, airportChange=true일때), depTz?(출발공항타임존). 예: [{"iata":"DMK","tz":"Asia/Bangkok","arrTime":"23:00","arrOffset":0,"depTime":"06:00","depOffset":1,"airportChange":true,"depIata":"BKK","depTz":"Asia/Bangkok"}] / null로 초기화'),
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 { content: [{ type: "text", text: `일정 ${item_id}이(가) 삭제되었습니다.` }] };
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.5",
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": ["dist"],
11
- "scripts": {
12
- "build": "tsc",
13
- "dev": "node --loader ts-node/esm src/index.ts",
14
- "start": "node dist/index.js"
15
- },
16
- "dependencies": {
17
- "@modelcontextprotocol/sdk": "^1.0.0",
18
- "zod": "^4.3.6"
19
- },
20
- "devDependencies": {
21
- "@types/node": "^25.5.0",
22
- "typescript": "^5.0.0"
23
- },
24
- "engines": {
25
- "node": ">=18"
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
+ }