@ampless/mcp-server 0.2.0-alpha.5 → 0.2.0-alpha.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/README.ja.md +148 -0
- package/README.md +3 -0
- package/dist/{chunk-KM6F5QJH.js → chunk-6LH275IC.js} +6 -17
- package/dist/index.js +1 -1
- package/dist/tools/index.d.ts +0 -4
- package/dist/tools/index.js +1 -1
- package/package.json +2 -2
package/README.ja.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
> English: [README.md](./README.md)
|
|
2
|
+
>
|
|
3
|
+
|
|
4
|
+
# @ampless/mcp-server
|
|
5
|
+
|
|
6
|
+
[ampless](https://github.com/heavymoons/ampless) 向け MCP(Model Context Protocol)サーバー。Claude Desktop、Cursor、Claude Code、その他 MCP 対応ツールから AI エージェントが CMS インスタンスの投稿を読み書きしたり、メディアをアップロードしたりできます。
|
|
7
|
+
|
|
8
|
+
> **プレリリース / アルファ版。** v1.0 まではマイナーバージョンでも破壊的変更が入る可能性があります。
|
|
9
|
+
|
|
10
|
+
## ツール一覧
|
|
11
|
+
|
|
12
|
+
| ツール | 機能 |
|
|
13
|
+
|---|---|
|
|
14
|
+
| `list_posts` | オプションの `status` フィルターとページネーション付きで投稿一覧を取得 |
|
|
15
|
+
| `get_post` | `slug` または `postId` で単一の投稿を取得 |
|
|
16
|
+
| `create_post` | 新しい投稿を作成(下書きまたは公開済み) |
|
|
17
|
+
| `update_post` | 既存の投稿のフィールドをパッチ更新 |
|
|
18
|
+
| `delete_post` | 投稿を削除しタグインデックスをクリーンアップ |
|
|
19
|
+
| `upload_media` | Base64 エンコードされたバイト列を S3 にアップロードし `Media` レコードを作成 |
|
|
20
|
+
| `get_schema` | CMS コンテンツスキーマ(Post / Page / Media のフィールド形状)を返す |
|
|
21
|
+
|
|
22
|
+
サーバーは指定した認証情報(環境変数)で Cognito ユーザープールにサインインするため、各ツールはそのユーザーのロール(`ampless-admin` または `ampless-editor`)で動作します。下書きや編集内容は認証済みユーザーにのみ表示されます。リゾルバー側の `status === 'published'` フィルターにより、未公開コンテンツはパブリック読み取りからは見えません。
|
|
23
|
+
|
|
24
|
+
## インストール
|
|
25
|
+
|
|
26
|
+
サーバーは Node CLI として公開されています。グローバルインストールは通常不要です — MCP クライアントから `npx -y @ampless/mcp-server@alpha` を指定してください。
|
|
27
|
+
|
|
28
|
+
## 設定
|
|
29
|
+
|
|
30
|
+
以下が必要です:
|
|
31
|
+
|
|
32
|
+
1. **`amplify_outputs.json`** — `npx ampx sandbox` または `npx ampx pipeline-deploy` で生成されます。パスは `--outputs` で渡します。
|
|
33
|
+
2. **Cognito ユーザーアカウント** — ユーザープールのメールアドレスとパスワード。管理 UI から最初に作成したユーザーは自動的に `ampless-admin` に登録されます。
|
|
34
|
+
3. **AWS 認証情報** — `upload_media` を使用する場合にのみ必要です。デフォルトの認証情報チェーン(`AWS_PROFILE`、環境変数、インスタンスロール)が使用されます。読み取り専用ツールは AWS 認証情報なしで動作します。
|
|
35
|
+
|
|
36
|
+
### Claude Desktop
|
|
37
|
+
|
|
38
|
+
`~/Library/Application Support/Claude/claude_desktop_config.json`(macOS)またはプラットフォームに応じた同等のパスを編集します:
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"mcpServers": {
|
|
43
|
+
"ampless": {
|
|
44
|
+
"command": "npx",
|
|
45
|
+
"args": [
|
|
46
|
+
"-y",
|
|
47
|
+
"@ampless/mcp-server",
|
|
48
|
+
"--outputs",
|
|
49
|
+
"/absolute/path/to/your-site/amplify_outputs.json"
|
|
50
|
+
],
|
|
51
|
+
"env": {
|
|
52
|
+
"AMPLESS_MCP_EMAIL": "you@example.com",
|
|
53
|
+
"AMPLESS_MCP_PASSWORD": "your-password"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Claude Desktop を再起動すると、7 つのツールが `/mcp` の下に表示されます。
|
|
61
|
+
|
|
62
|
+
### Cursor
|
|
63
|
+
|
|
64
|
+
`~/.cursor/mcp.json` を編集するか、**Cursor Settings → MCP** を使用します。設定の形式は Claude Desktop と同じです:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"ampless": {
|
|
70
|
+
"command": "npx",
|
|
71
|
+
"args": ["-y", "@ampless/mcp-server", "--outputs", "/path/to/amplify_outputs.json"],
|
|
72
|
+
"env": {
|
|
73
|
+
"AMPLESS_MCP_EMAIL": "you@example.com",
|
|
74
|
+
"AMPLESS_MCP_PASSWORD": "your-password"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Claude Code
|
|
82
|
+
|
|
83
|
+
プロジェクトレベルの MCP サーバーを追加します:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
claude mcp add ampless \
|
|
87
|
+
--env AMPLESS_MCP_EMAIL=you@example.com \
|
|
88
|
+
--env AMPLESS_MCP_PASSWORD=your-password \
|
|
89
|
+
-- npx -y @ampless/mcp-server --outputs /path/to/amplify_outputs.json
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 使用例
|
|
93
|
+
|
|
94
|
+
登録後、AI エージェントに次のように指示できます:
|
|
95
|
+
|
|
96
|
+
- 「最新の投稿を 5 件表示して。」
|
|
97
|
+
- 「スラッグ `welcome` の投稿を見せて。」
|
|
98
|
+
- 「タイトル '2 記事目' の下書きを markdown 形式で、本文 'Hello world.' で作成して。」
|
|
99
|
+
- 「投稿 `post-1234` を公開して。」
|
|
100
|
+
- 「スラッグ `bad-draft` の投稿を削除して。」
|
|
101
|
+
|
|
102
|
+
エージェントが自動的に適切なツールを選択します。
|
|
103
|
+
|
|
104
|
+
### `format` ごとの `body` の形式
|
|
105
|
+
|
|
106
|
+
- `format: 'markdown'` → body は markdown ソース文字列
|
|
107
|
+
- `format: 'html'` → body は生の HTML 文字列(そのままレンダリングされます — 下記のエディタートラストモデルを参照)
|
|
108
|
+
- `format: 'tiptap'` → body は tiptap ドキュメント JSON、例:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"type": "doc",
|
|
113
|
+
"content": [
|
|
114
|
+
{ "type": "paragraph", "content": [{ "type": "text", "text": "Hello" }] }
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
AI に投稿本文を生成させる場合は、markdown を指定するのが最も簡単です。
|
|
120
|
+
|
|
121
|
+
## セキュリティに関する注意
|
|
122
|
+
|
|
123
|
+
- **エディタートラストモデル。** ampless は `editor` と `admin` を同一のトラストクラスとして扱います — どちらも投稿本文に任意の HTML / JS を格納できます(`docs/architecture/04-access-layer-mcp.md` 参照)。MCP サーバーが書き込める内容は、そのユーザーアカウントが管理 UI から書き込める内容と同じです。
|
|
124
|
+
- **設定ファイル内の認証情報。** `AMPLESS_MCP_PASSWORD` は Claude Desktop / Cursor の設定ファイル内にプレーンテキストで保存されます。SSH 秘密鍵と同様に扱ってください。v0.2 で OS キーチェーン連携を追加予定です。
|
|
125
|
+
- **AWS 認証情報。** `upload_media` のみ必要です。サイトの S3 バケットへの書き込み権限のみを持つ専用の IAM ユーザー / ロールを使用してください。
|
|
126
|
+
|
|
127
|
+
## CLI フラグ
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
ampless-mcp [options]
|
|
131
|
+
|
|
132
|
+
--outputs <path> amplify_outputs.json へのパス(AMPLESS_MCP_OUTPUTS でも指定可)
|
|
133
|
+
--site-id <id> クエリのデフォルト siteId(AMPLESS_MCP_SITE_ID でも指定可、デフォルト "default")
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
必須の環境変数:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
AMPLESS_MCP_EMAIL Cognito ユーザーのメールアドレス
|
|
140
|
+
AMPLESS_MCP_PASSWORD Cognito ユーザーのパスワード
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## トラブルシューティング
|
|
144
|
+
|
|
145
|
+
- **`NotAuthorizedException: Incorrect username or password.`** — 認証情報が誤っているか、メールアドレスが未確認です。まず Web の `/login` から一度サインインしてください。
|
|
146
|
+
- **`InvalidPasswordException`** — ユーザーが `FORCE_CHANGE_PASSWORD` 状態です。Web UI からサインインして永続パスワードを設定してください。
|
|
147
|
+
- **`AppSync 401`** — ID トークンが拒否された可能性があります。サーバーは次の呼び出し時に自動更新します。繰り返し 401 が発生する場合は、ユーザープールが再デプロイされている可能性があるため認証情報を更新してください。
|
|
148
|
+
- **`upload_media` が AWS 認証情報なしで失敗する** — MCP サーバーの環境に `AWS_PROFILE` または `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` を設定してください。
|
package/README.md
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
> 日本語版: [README.ja.md](./README.ja.md)
|
|
2
|
+
>
|
|
3
|
+
|
|
1
4
|
# @ampless/mcp-server
|
|
2
5
|
|
|
3
6
|
MCP (Model Context Protocol) server for [ampless](https://github.com/heavymoons/ampless). Lets AI agents — Claude Desktop, Cursor, Claude Code, and anything else that speaks MCP — read and write posts and upload media on your CMS instance.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/tools/post-mapping.ts
|
|
4
|
+
import { decodeAwsJson } from "ampless";
|
|
4
5
|
var POST_FIELDS = (
|
|
5
6
|
/* GraphQL */
|
|
6
7
|
`
|
|
@@ -18,18 +19,6 @@ var POST_FIELDS = (
|
|
|
18
19
|
}
|
|
19
20
|
`
|
|
20
21
|
);
|
|
21
|
-
function decodeBody(value) {
|
|
22
|
-
if (typeof value !== "string") return value;
|
|
23
|
-
try {
|
|
24
|
-
return JSON.parse(value);
|
|
25
|
-
} catch {
|
|
26
|
-
return value;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
function encodeBody(value) {
|
|
30
|
-
if (typeof value === "string") return value;
|
|
31
|
-
return JSON.stringify(value ?? null);
|
|
32
|
-
}
|
|
33
22
|
function toCorePost(p) {
|
|
34
23
|
return {
|
|
35
24
|
siteId: p.siteId,
|
|
@@ -38,7 +27,7 @@ function toCorePost(p) {
|
|
|
38
27
|
title: p.title,
|
|
39
28
|
excerpt: p.excerpt ?? void 0,
|
|
40
29
|
format: p.format ?? "markdown",
|
|
41
|
-
body:
|
|
30
|
+
body: decodeAwsJson(p.body),
|
|
42
31
|
status: p.status ?? "draft",
|
|
43
32
|
publishedAt: p.publishedAt ?? void 0,
|
|
44
33
|
tags: (p.tags ?? []).filter((t) => typeof t === "string")
|
|
@@ -135,7 +124,7 @@ async function getPost(client, defaultSiteId, args) {
|
|
|
135
124
|
}
|
|
136
125
|
|
|
137
126
|
// src/tools/create-post.ts
|
|
138
|
-
import { composeSiteIdStatus, composeSiteIdSlug } from "ampless";
|
|
127
|
+
import { composeSiteIdStatus, composeSiteIdSlug, encodeAwsJson } from "ampless";
|
|
139
128
|
|
|
140
129
|
// src/posttag.ts
|
|
141
130
|
function entries(post) {
|
|
@@ -270,7 +259,7 @@ async function createPost(client, defaultSiteId, args) {
|
|
|
270
259
|
title: args.title,
|
|
271
260
|
excerpt: args.excerpt,
|
|
272
261
|
format: args.format,
|
|
273
|
-
body:
|
|
262
|
+
body: encodeAwsJson(args.body),
|
|
274
263
|
status,
|
|
275
264
|
publishedAt,
|
|
276
265
|
tags: args.tags,
|
|
@@ -285,7 +274,7 @@ async function createPost(client, defaultSiteId, args) {
|
|
|
285
274
|
}
|
|
286
275
|
|
|
287
276
|
// src/tools/update-post.ts
|
|
288
|
-
import { composeSiteIdStatus as composeSiteIdStatus2, composeSiteIdSlug as composeSiteIdSlug2 } from "ampless";
|
|
277
|
+
import { composeSiteIdStatus as composeSiteIdStatus2, composeSiteIdSlug as composeSiteIdSlug2, encodeAwsJson as encodeAwsJson2 } from "ampless";
|
|
289
278
|
var MUTATION2 = (
|
|
290
279
|
/* GraphQL */
|
|
291
280
|
`
|
|
@@ -321,7 +310,7 @@ async function updatePost(client, defaultSiteId, args) {
|
|
|
321
310
|
if (args.title !== void 0) input.title = args.title;
|
|
322
311
|
if (args.excerpt !== void 0) input.excerpt = args.excerpt;
|
|
323
312
|
if (args.format !== void 0) input.format = args.format;
|
|
324
|
-
if (args.body !== void 0) input.body =
|
|
313
|
+
if (args.body !== void 0) input.body = encodeAwsJson2(args.body);
|
|
325
314
|
if (args.status !== void 0) input.status = args.status;
|
|
326
315
|
if (args.publishedAt !== void 0) input.publishedAt = args.publishedAt;
|
|
327
316
|
if (args.tags !== void 0) input.tags = args.tags;
|
package/dist/index.js
CHANGED
package/dist/tools/index.d.ts
CHANGED
|
@@ -40,10 +40,6 @@ declare const tools: ToolDefinition[];
|
|
|
40
40
|
* Look up a tool definition by name and invoke its handler. Returns
|
|
41
41
|
* `null` when no tool with that name is registered — callers should
|
|
42
42
|
* surface that as a JSON-RPC "method not found" error.
|
|
43
|
-
*
|
|
44
|
-
* Shared between the stdio CLI (`src/index.ts`) and the HTTP transport
|
|
45
|
-
* factory (`@ampless/admin/api/mcp` → `createMcpRoute`) so both routes
|
|
46
|
-
* dispatch through the same code path.
|
|
47
43
|
*/
|
|
48
44
|
declare function dispatchToolCall(name: string, args: Record<string, unknown>, ctx: ToolContext): Promise<unknown>;
|
|
49
45
|
/**
|
package/dist/tools/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ampless/mcp-server",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.7",
|
|
4
4
|
"description": "MCP server for ampless — lets AI agents (Claude Desktop, Cursor, Claude Code) read and write posts and media via AppSync",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
36
36
|
"@aws-sdk/client-s3": "^3.1048.0",
|
|
37
37
|
"amazon-cognito-identity-js": "^6.3.12",
|
|
38
|
-
"ampless": "0.2.0-alpha.
|
|
38
|
+
"ampless": "0.2.0-alpha.7"
|
|
39
39
|
},
|
|
40
40
|
"keywords": [
|
|
41
41
|
"ampless",
|