Skip to content

Commit 218fe1c

Browse files
committed
Add new microCMS Management API functions and update manifest
- Introduced `getMember` function to retrieve specific member details. - Added `deleteMedia` function for media file deletion. - Updated `manifest.json` to include new API tools: `microcms_get_api_list`, `microcms_get_member`, and `microcms_delete_media`. - Enhanced server request handling to support new functionalities.
1 parent 06231a2 commit 218fe1c

File tree

6 files changed

+122
-0
lines changed

6 files changed

+122
-0
lines changed

manifest.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@
6767
{
6868
"name": "microcms_get_api_info",
6969
"description": "Get API information from microCMS"
70+
},
71+
{
72+
"name": "microcms_get_api_list",
73+
"description": "Get list of all available APIs (endpoints) from microCMS Management API"
74+
},
75+
{
76+
"name": "microcms_get_member",
77+
"description": "Get a specific member from microCMS Management API. Returns member information including ID, name, email, and MFA status"
78+
},
79+
{
80+
"name": "microcms_delete_media",
81+
"description": "Delete media files from microCMS (Management API). Supports deletion of both images and files"
7082
}
7183
],
7284
"user_config": {

src/client.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,5 +124,41 @@ export async function getApiList(): Promise<any> {
124124
throw new Error(`Failed to get API list: ${response.status} ${response.statusText} - ${errorText}`);
125125
}
126126

127+
return await response.json();
128+
}
129+
130+
export async function getMember(memberId: string): Promise<any> {
131+
const url = `https://${config.serviceDomain}.microcms-management.io/api/v1/members/${memberId}`;
132+
133+
const response = await fetch(url, {
134+
method: 'GET',
135+
headers: {
136+
'X-MICROCMS-API-KEY': config.apiKey,
137+
},
138+
});
139+
140+
if (!response.ok) {
141+
const errorText = await response.text();
142+
throw new Error(`Failed to get member: ${response.status} ${response.statusText} - ${errorText}`);
143+
}
144+
145+
return await response.json();
146+
}
147+
148+
export async function deleteMedia(mediaUrl: string): Promise<{ id: string }> {
149+
const url = `https://${config.serviceDomain}.microcms-management.io/api/v2/media?url=${encodeURIComponent(mediaUrl)}`;
150+
151+
const response = await fetch(url, {
152+
method: 'DELETE',
153+
headers: {
154+
'X-MICROCMS-API-KEY': config.apiKey,
155+
},
156+
});
157+
158+
if (!response.ok) {
159+
const errorText = await response.text();
160+
throw new Error(`Failed to delete media: ${response.status} ${response.statusText} - ${errorText}`);
161+
}
162+
127163
return await response.json();
128164
}

src/server.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import { patchContentTool, handlePatchContent } from './tools/patch-content.js';
1515
import { deleteContentTool, handleDeleteContent } from './tools/delete-content.js';
1616
import { getMediaTool, handleGetMedia } from './tools/get-media.js';
1717
import { uploadMediaTool, handleUploadMedia } from './tools/upload-media.js';
18+
import { deleteMediaTool, handleDeleteMedia } from './tools/delete-media.js';
1819
import { getApiInfoTool, handleGetApiInfo } from './tools/get-api-info.js';
1920
import { getApiListTool, handleGetApiList } from './tools/get-apis-list.js';
21+
import { getMemberTool, handleGetMember } from './tools/get-member.js';
2022
import type { ToolParameters, MediaToolParameters } from './types.js';
2123

2224
const server = new Server(
@@ -45,8 +47,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
4547
deleteContentTool,
4648
getMediaTool,
4749
uploadMediaTool,
50+
deleteMediaTool,
4851
getApiInfoTool,
4952
getApiListTool,
53+
getMemberTool,
5054
],
5155
};
5256
});
@@ -89,12 +93,18 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
8993
case 'microcms_upload_media':
9094
result = await handleUploadMedia(params as unknown as MediaToolParameters);
9195
break;
96+
case 'microcms_delete_media':
97+
result = await handleDeleteMedia(params as unknown as MediaToolParameters & { url: string });
98+
break;
9299
case 'microcms_get_api_info':
93100
result = await handleGetApiInfo(params);
94101
break;
95102
case 'microcms_get_api_list':
96103
result = await handleGetApiList(params);
97104
break;
105+
case 'microcms_get_member':
106+
result = await handleGetMember(params as ToolParameters & { memberId: string });
107+
break;
98108
default:
99109
throw new Error(`Unknown tool: ${name}`);
100110
}

src/tools/delete-media.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
2+
import { deleteMedia } from '../client.js';
3+
import type { MediaToolParameters } from '../types.js';
4+
5+
export const deleteMediaTool: Tool = {
6+
name: 'microcms_delete_media',
7+
description: 'Delete media files from microCMS (Management API). Supports deletion of both images and files. Requires media deletion permissions. Note: Media referenced by content cannot be deleted.',
8+
inputSchema: {
9+
type: 'object',
10+
properties: {
11+
url: {
12+
type: 'string',
13+
description: 'URL of the media to delete (e.g., "https://images.microcms-assets.io/assets/xxxxx/yyyyy/hoge.jpg" or "https://files.microcms-assets.io/assets/xxxxx/yyyyy/hoge.pdf"). Custom domain URLs are also supported.',
14+
},
15+
},
16+
required: ['url'],
17+
},
18+
};
19+
20+
export async function handleDeleteMedia(params: MediaToolParameters & { url: string }) {
21+
const { url } = params;
22+
23+
if (!url) {
24+
throw new Error('url is required');
25+
}
26+
27+
return await deleteMedia(url);
28+
}
29+

src/tools/get-member.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
2+
import { getMember } from '../client.js';
3+
import type { ToolParameters } from '../types.js';
4+
5+
export const getMemberTool: Tool = {
6+
name: 'microcms_get_member',
7+
description: 'Get a specific member from microCMS Management API. Returns member information including ID, name, email, and MFA status.',
8+
inputSchema: {
9+
type: 'object',
10+
properties: {
11+
memberId: {
12+
type: 'string',
13+
description: 'Member ID to retrieve',
14+
},
15+
},
16+
required: ['memberId'],
17+
},
18+
};
19+
20+
export async function handleGetMember(params: ToolParameters & { memberId: string }) {
21+
const { memberId } = params;
22+
23+
return await getMember(memberId);
24+
}
25+

src/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ export interface MicroCMSErrorResponse {
4949
}>;
5050
}
5151

52+
export interface MemberInfo {
53+
id: string;
54+
name: string;
55+
email: string;
56+
mfa: boolean;
57+
}
58+
5259
export interface ToolParameters {
5360
endpoint: string;
5461
contentId?: string;
@@ -69,6 +76,8 @@ export interface ToolParameters {
6976
token?: string;
7077
fileData?: string;
7178
mimeType?: string;
79+
// Member parameters
80+
memberId?: string;
7281
}
7382

7483
export interface MediaToolParameters {
@@ -79,4 +88,5 @@ export interface MediaToolParameters {
7988
fileData?: string;
8089
mimeType?: string;
8190
externalUrl?: string;
91+
url?: string;
8292
}

0 commit comments

Comments
 (0)