@miguel-carrera/aws-bedrock-mcp-server 1.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 ADDED
@@ -0,0 +1,106 @@
1
+ # aws-bedrock-mcp-server
2
+
3
+ MCP server for AWS Bedrock Knowledge Base — exposes two tools for semantic search and RAG.
4
+
5
+ | Tool | Description |
6
+ |------|-------------|
7
+ | `bedrock_retrieve` | Semantic / hybrid search — returns raw passages from the Knowledge Base |
8
+ | `bedrock_retrieve_and_generate` | Full RAG pipeline — retrieves passages **and** generates a grounded answer |
9
+
10
+ ---
11
+
12
+ ## Usage with Claude Code
13
+
14
+ ```bash
15
+ claude mcp add aws-bedrock -- npx -y @miguel-carrera/aws-bedrock-mcp-server
16
+ ```
17
+
18
+ Or add to your `claude_desktop_config.json` / `.mcp.json`:
19
+
20
+ ```json
21
+ {
22
+ "mcpServers": {
23
+ "aws-bedrock": {
24
+ "command": "npx",
25
+ "args": ["-y", "@miguel-carrera/aws-bedrock-mcp-server"],
26
+ "env": {
27
+ "BEDROCK_KNOWLEDGE_BASE_ID": "<your-kb-id>",
28
+ "AWS_REGION": "us-east-1",
29
+ "AWS_PROFILE": "default"
30
+ }
31
+ }
32
+ }
33
+ }
34
+ ```
35
+
36
+ ---
37
+
38
+ ## Prerequisites
39
+
40
+ - Node.js ≥ 18
41
+ - AWS credentials configured in `~/.aws/credentials` or `~/.aws/config`
42
+
43
+ Required IAM permissions:
44
+
45
+ ```json
46
+ {
47
+ "Effect": "Allow",
48
+ "Action": [
49
+ "bedrock:Retrieve",
50
+ "bedrock:RetrieveAndGenerate"
51
+ ],
52
+ "Resource": "arn:aws:bedrock:*:*:knowledge-base/*"
53
+ }
54
+ ```
55
+
56
+ ---
57
+
58
+ ## Configuration
59
+
60
+ | Environment variable | Required | Default | Description |
61
+ |---|---|---|---|
62
+ | `BEDROCK_KNOWLEDGE_BASE_ID` | Recommended | — | Default Knowledge Base ID; can be overridden per tool call |
63
+ | `AWS_REGION` | No | `us-east-1` | AWS region where your Knowledge Base lives |
64
+ | `AWS_PROFILE` | No | `default` | AWS named profile from `~/.aws` |
65
+
66
+ ---
67
+
68
+ ## Tools
69
+
70
+ ### `bedrock_retrieve`
71
+
72
+ Search the Knowledge Base and return raw passages.
73
+
74
+ | Parameter | Type | Default | Description |
75
+ |---|---|---|---|
76
+ | `query` | string | — | Natural language search query (required) |
77
+ | `knowledge_base_id` | string | env var | Bedrock KB ID |
78
+ | `number_of_results` | number | 5 | Passages to return (1–100) |
79
+ | `search_type` | `SEMANTIC` \| `HYBRID` | `SEMANTIC` | Search strategy |
80
+ | `next_token` | string | — | Pagination cursor |
81
+ | `response_format` | `markdown` \| `json` | `markdown` | Output format |
82
+
83
+ ### `bedrock_retrieve_and_generate`
84
+
85
+ Retrieve passages and generate a grounded answer using a Bedrock model.
86
+
87
+ | Parameter | Type | Default | Description |
88
+ |---|---|---|---|
89
+ | `query` | string | — | Question to answer (required) |
90
+ | `knowledge_base_id` | string | env var | Bedrock KB ID |
91
+ | `model_arn` | string | Claude 3 Haiku | ARN of the Bedrock model for generation |
92
+ | `number_of_results` | number | 5 | Passages to retrieve (1–100) |
93
+ | `search_type` | `SEMANTIC` \| `HYBRID` | `SEMANTIC` | Search strategy |
94
+ | `session_id` | string | — | Session ID for multi-turn conversations |
95
+ | `system_prompt` | string | — | Custom generation prompt (use `$search_results$` placeholder) |
96
+ | `response_format` | `markdown` \| `json` | `markdown` | Output format |
97
+
98
+ ---
99
+
100
+ ## Development
101
+
102
+ ```bash
103
+ npm install
104
+ npm run dev # watch mode
105
+ npm run build # compile to dist/
106
+ ```
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server for AWS Bedrock Knowledge Base Retrieve API.
4
+ *
5
+ * Provides two tools:
6
+ * - bedrock_retrieve Semantic / hybrid search over a Knowledge Base
7
+ * - bedrock_retrieve_and_generate RAG: retrieve + generate an answer via a Bedrock model
8
+ *
9
+ * Configuration (environment variables):
10
+ * BEDROCK_KNOWLEDGE_BASE_ID Default Knowledge Base ID (required unless passed per-call)
11
+ * AWS_REGION AWS region (default: us-east-1)
12
+ * AWS_PROFILE AWS named profile (default: default)
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
package/dist/index.js ADDED
@@ -0,0 +1,378 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server for AWS Bedrock Knowledge Base Retrieve API.
4
+ *
5
+ * Provides two tools:
6
+ * - bedrock_retrieve Semantic / hybrid search over a Knowledge Base
7
+ * - bedrock_retrieve_and_generate RAG: retrieve + generate an answer via a Bedrock model
8
+ *
9
+ * Configuration (environment variables):
10
+ * BEDROCK_KNOWLEDGE_BASE_ID Default Knowledge Base ID (required unless passed per-call)
11
+ * AWS_REGION AWS region (default: us-east-1)
12
+ * AWS_PROFILE AWS named profile (default: default)
13
+ */
14
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
15
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
16
+ import { z } from "zod";
17
+ import { retrieve, retrieveAndGenerate, formatAwsError, } from "./services/bedrock.js";
18
+ // ── Constants ─────────────────────────────────────────────────────────────────
19
+ const CHARACTER_LIMIT = 25_000;
20
+ const DEFAULT_KB_ID = process.env.BEDROCK_KNOWLEDGE_BASE_ID ?? "";
21
+ // ── Helpers ───────────────────────────────────────────────────────────────────
22
+ function formatLocation(location) {
23
+ if (!location)
24
+ return "unknown";
25
+ if (location.type === "S3")
26
+ return location.s3Location?.uri ?? "s3://unknown";
27
+ if (location.type === "WEB")
28
+ return location.webLocation?.url ?? "web://unknown";
29
+ if (location.type === "CONFLUENCE")
30
+ return location.confluenceLocation?.url ?? "confluence://unknown";
31
+ if (location.type === "SALESFORCE")
32
+ return location.salesforceLocation?.url ?? "salesforce://unknown";
33
+ if (location.type === "SHAREPOINT")
34
+ return location.sharePointLocation?.url ?? "sharepoint://unknown";
35
+ return location.type ?? "unknown";
36
+ }
37
+ function passagesToMarkdown(passages) {
38
+ return passages
39
+ .map((p, i) => {
40
+ const score = p.score !== undefined ? ` (score: ${p.score.toFixed(4)})` : "";
41
+ const src = formatLocation(p.location);
42
+ return `### Result ${i + 1}${score}\n**Source**: ${src}\n\n${p.content}`;
43
+ })
44
+ .join("\n\n---\n\n");
45
+ }
46
+ function citationsToMarkdown(citations) {
47
+ return citations
48
+ .map((c, i) => {
49
+ const refs = c.passages
50
+ .map((p) => ` - ${formatLocation(p.location)}`)
51
+ .join("\n");
52
+ return `**[${i + 1}]** ${c.generatedText ?? ""}\n*Sources*:\n${refs}`;
53
+ })
54
+ .join("\n\n");
55
+ }
56
+ function truncate(text) {
57
+ if (text.length <= CHARACTER_LIMIT)
58
+ return { text, truncated: false };
59
+ return {
60
+ text: text.slice(0, CHARACTER_LIMIT) + "\n\n[Response truncated. Use `numberOfResults` or a more specific query to reduce output size.]",
61
+ truncated: true,
62
+ };
63
+ }
64
+ // ── Server ────────────────────────────────────────────────────────────────────
65
+ const server = new McpServer({
66
+ name: "bedrock-mcp-server",
67
+ version: "1.0.0",
68
+ });
69
+ // ── Tool: bedrock_retrieve ────────────────────────────────────────────────────
70
+ const RetrieveInputSchema = z
71
+ .object({
72
+ query: z
73
+ .string()
74
+ .min(1, "Query must not be empty")
75
+ .max(1000, "Query must not exceed 1000 characters")
76
+ .describe("Natural language query to search the Knowledge Base"),
77
+ knowledge_base_id: z
78
+ .string()
79
+ .optional()
80
+ .describe("Bedrock Knowledge Base ID. Defaults to BEDROCK_KNOWLEDGE_BASE_ID env var if not provided."),
81
+ number_of_results: z
82
+ .number()
83
+ .int()
84
+ .min(1)
85
+ .max(100)
86
+ .default(5)
87
+ .describe("Number of passages to retrieve (1–100, default: 5)"),
88
+ search_type: z
89
+ .enum(["SEMANTIC", "HYBRID"])
90
+ .default("SEMANTIC")
91
+ .describe("Search strategy: 'SEMANTIC' for pure vector search, 'HYBRID' for vector + keyword (default: SEMANTIC)"),
92
+ next_token: z
93
+ .string()
94
+ .optional()
95
+ .describe("Pagination token from a previous response to fetch the next page of results"),
96
+ response_format: z
97
+ .enum(["markdown", "json"])
98
+ .default("markdown")
99
+ .describe("Output format: 'markdown' for human-readable, 'json' for structured data"),
100
+ })
101
+ .strict();
102
+ server.registerTool("bedrock_retrieve", {
103
+ title: "Retrieve from Bedrock Knowledge Base",
104
+ description: `Perform a semantic or hybrid search against an AWS Bedrock Knowledge Base and return the most relevant text passages.
105
+
106
+ Use this tool when you need to find specific information stored in the Knowledge Base — for example, product documentation, FAQs, internal policies, or any indexed content.
107
+
108
+ Args:
109
+ - query (string): Natural language question or search phrase (required)
110
+ - knowledge_base_id (string): Bedrock KB ID (e.g. "ABCDE12345"). Defaults to BEDROCK_KNOWLEDGE_BASE_ID env var.
111
+ - number_of_results (number): How many passages to return, 1–100 (default: 5)
112
+ - search_type ('SEMANTIC' | 'HYBRID'): Search strategy (default: 'SEMANTIC')
113
+ - next_token (string): Pagination cursor from a previous call
114
+ - response_format ('markdown' | 'json'): Output format (default: 'markdown')
115
+
116
+ Returns for JSON format:
117
+ {
118
+ "passages": [
119
+ {
120
+ "content": string, // Retrieved text chunk
121
+ "score": number, // Relevance score (0–1)
122
+ "location": { // Source location
123
+ "type": string, // "S3" | "WEB" | "CONFLUENCE" | etc.
124
+ "uri": string // Source URI
125
+ },
126
+ "metadata": object // Optional key-value metadata
127
+ }
128
+ ],
129
+ "next_token": string | null // Cursor for next page (null if no more results)
130
+ }
131
+
132
+ Examples:
133
+ - "Find passages about return policy" → query="return policy", number_of_results=5
134
+ - "Get top 10 results about shipping" → query="shipping", number_of_results=10, search_type="HYBRID"
135
+ - "Next page of results" → query="shipping", next_token="<token from previous call>"
136
+
137
+ Error handling:
138
+ - Returns "Error: Knowledge Base not found" if the KB ID is wrong
139
+ - Returns "Error: Access denied" if the AWS profile lacks bedrock:Retrieve permission
140
+ - Returns "Error: AWS request throttled" on rate limit`,
141
+ inputSchema: RetrieveInputSchema,
142
+ annotations: {
143
+ readOnlyHint: true,
144
+ destructiveHint: false,
145
+ idempotentHint: true,
146
+ openWorldHint: true,
147
+ },
148
+ }, async (params) => {
149
+ const kbId = params.knowledge_base_id ?? DEFAULT_KB_ID;
150
+ if (!kbId) {
151
+ return {
152
+ content: [
153
+ {
154
+ type: "text",
155
+ text: "Error: No Knowledge Base ID provided. Pass 'knowledge_base_id' or set the BEDROCK_KNOWLEDGE_BASE_ID environment variable.",
156
+ },
157
+ ],
158
+ isError: true,
159
+ };
160
+ }
161
+ try {
162
+ const result = await retrieve({
163
+ knowledgeBaseId: kbId,
164
+ query: params.query,
165
+ numberOfResults: params.number_of_results,
166
+ searchType: params.search_type,
167
+ nextToken: params.next_token,
168
+ });
169
+ if (result.passages.length === 0) {
170
+ return {
171
+ content: [{ type: "text", text: `No results found for query: "${params.query}"` }],
172
+ };
173
+ }
174
+ const structured = {
175
+ passages: result.passages.map((p) => ({
176
+ content: p.content,
177
+ score: p.score,
178
+ location: p.location
179
+ ? { type: p.location.type, uri: formatLocation(p.location) }
180
+ : null,
181
+ metadata: p.metadata ?? null,
182
+ })),
183
+ next_token: result.nextToken ?? null,
184
+ };
185
+ let text;
186
+ if (params.response_format === "json") {
187
+ text = JSON.stringify(structured, null, 2);
188
+ }
189
+ else {
190
+ text = [
191
+ `# Knowledge Base Results for: "${params.query}"`,
192
+ `Found ${result.passages.length} passages${result.nextToken ? " (more available)" : ""}.`,
193
+ "",
194
+ passagesToMarkdown(result.passages),
195
+ ...(result.nextToken
196
+ ? ["", `---`, `*More results available. Pass \`next_token: "${result.nextToken}"\` to continue.*`]
197
+ : []),
198
+ ].join("\n");
199
+ }
200
+ const { text: finalText } = truncate(text);
201
+ return {
202
+ content: [{ type: "text", text: finalText }],
203
+ structuredContent: structured,
204
+ };
205
+ }
206
+ catch (error) {
207
+ return {
208
+ content: [{ type: "text", text: formatAwsError(error) }],
209
+ isError: true,
210
+ };
211
+ }
212
+ });
213
+ // ── Tool: bedrock_retrieve_and_generate ──────────────────────────────────────
214
+ const RetrieveAndGenerateInputSchema = z
215
+ .object({
216
+ query: z
217
+ .string()
218
+ .min(1, "Query must not be empty")
219
+ .max(1000, "Query must not exceed 1000 characters")
220
+ .describe("Natural language question to answer using the Knowledge Base"),
221
+ knowledge_base_id: z
222
+ .string()
223
+ .optional()
224
+ .describe("Bedrock Knowledge Base ID. Defaults to BEDROCK_KNOWLEDGE_BASE_ID env var if not provided."),
225
+ model_arn: z
226
+ .string()
227
+ .default("arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0")
228
+ .describe("ARN of the Bedrock foundation model used for generation (default: Claude 3 Haiku). Use a model available in your region."),
229
+ number_of_results: z
230
+ .number()
231
+ .int()
232
+ .min(1)
233
+ .max(100)
234
+ .default(5)
235
+ .describe("Number of passages to retrieve before generating (1–100, default: 5)"),
236
+ search_type: z
237
+ .enum(["SEMANTIC", "HYBRID"])
238
+ .default("SEMANTIC")
239
+ .describe("Search strategy: 'SEMANTIC' or 'HYBRID' (default: SEMANTIC)"),
240
+ session_id: z
241
+ .string()
242
+ .optional()
243
+ .describe("Session ID from a previous call to continue a multi-turn conversation in the same KB session"),
244
+ system_prompt: z
245
+ .string()
246
+ .optional()
247
+ .describe("Optional custom system prompt template for the generation step. Use $search_results$ as placeholder for the retrieved content."),
248
+ response_format: z
249
+ .enum(["markdown", "json"])
250
+ .default("markdown")
251
+ .describe("Output format: 'markdown' for human-readable, 'json' for structured data"),
252
+ })
253
+ .strict();
254
+ server.registerTool("bedrock_retrieve_and_generate", {
255
+ title: "Retrieve and Generate from Bedrock Knowledge Base",
256
+ description: `Perform a full RAG (Retrieval-Augmented Generation) pipeline: retrieve relevant passages from a Bedrock Knowledge Base and then generate a grounded answer using a Bedrock foundation model.
257
+
258
+ Use this tool when you need a synthesized, natural language answer based on Knowledge Base content, with citations pointing back to the source passages.
259
+
260
+ Args:
261
+ - query (string): Natural language question (required)
262
+ - knowledge_base_id (string): Bedrock KB ID. Defaults to BEDROCK_KNOWLEDGE_BASE_ID env var.
263
+ - model_arn (string): ARN of the Bedrock model to use for generation (default: Claude 3 Haiku)
264
+ - number_of_results (number): Passages to retrieve before generating, 1–100 (default: 5)
265
+ - search_type ('SEMANTIC' | 'HYBRID'): Search strategy (default: 'SEMANTIC')
266
+ - session_id (string): Session ID from a previous call for multi-turn conversation
267
+ - system_prompt (string): Custom generation prompt template (use $search_results$ placeholder)
268
+ - response_format ('markdown' | 'json'): Output format (default: 'markdown')
269
+
270
+ Returns for JSON format:
271
+ {
272
+ "output": string, // Generated answer grounded in KB content
273
+ "session_id": string, // Session ID for follow-up questions
274
+ "citations": [
275
+ {
276
+ "generated_text": string, // Span of generated text
277
+ "sources": [ // Passages that support this span
278
+ { "content": string, "location": { "type": string, "uri": string } }
279
+ ]
280
+ }
281
+ ]
282
+ }
283
+
284
+ Examples:
285
+ - "What is the refund policy?" → query="refund policy"
286
+ - "Continue conversation" → query="Can I also return accessories?", session_id="<id from previous>"
287
+ - "Use Claude 3 Sonnet" → model_arn="arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0"
288
+
289
+ Error handling:
290
+ - Returns "Error: Knowledge Base not found" if the KB ID is wrong
291
+ - Returns "Error: Access denied" if missing bedrock:RetrieveAndGenerate permission
292
+ - Returns "Error: Invalid request" if the model ARN is incorrect`,
293
+ inputSchema: RetrieveAndGenerateInputSchema,
294
+ annotations: {
295
+ readOnlyHint: true,
296
+ destructiveHint: false,
297
+ idempotentHint: false,
298
+ openWorldHint: true,
299
+ },
300
+ }, async (params) => {
301
+ const kbId = params.knowledge_base_id ?? DEFAULT_KB_ID;
302
+ if (!kbId) {
303
+ return {
304
+ content: [
305
+ {
306
+ type: "text",
307
+ text: "Error: No Knowledge Base ID provided. Pass 'knowledge_base_id' or set the BEDROCK_KNOWLEDGE_BASE_ID environment variable.",
308
+ },
309
+ ],
310
+ isError: true,
311
+ };
312
+ }
313
+ try {
314
+ const result = await retrieveAndGenerate({
315
+ knowledgeBaseId: kbId,
316
+ modelArn: params.model_arn,
317
+ query: params.query,
318
+ numberOfResults: params.number_of_results,
319
+ searchType: params.search_type,
320
+ sessionId: params.session_id,
321
+ systemPrompt: params.system_prompt,
322
+ });
323
+ const structured = {
324
+ output: result.output,
325
+ session_id: result.sessionId ?? null,
326
+ citations: result.citations.map((c) => ({
327
+ generated_text: c.generatedText ?? null,
328
+ sources: c.passages.map((p) => ({
329
+ content: p.content,
330
+ location: p.location
331
+ ? { type: p.location.type, uri: formatLocation(p.location) }
332
+ : null,
333
+ metadata: p.metadata ?? null,
334
+ })),
335
+ })),
336
+ };
337
+ let text;
338
+ if (params.response_format === "json") {
339
+ text = JSON.stringify(structured, null, 2);
340
+ }
341
+ else {
342
+ const citationBlock = result.citations.length > 0
343
+ ? `\n\n## Citations\n\n${citationsToMarkdown(result.citations)}`
344
+ : "";
345
+ const sessionNote = result.sessionId
346
+ ? `\n\n---\n*Session ID: \`${result.sessionId}\` — pass this as \`session_id\` to continue the conversation.*`
347
+ : "";
348
+ text = `# Answer\n\n${result.output}${citationBlock}${sessionNote}`;
349
+ }
350
+ const { text: finalText } = truncate(text);
351
+ return {
352
+ content: [{ type: "text", text: finalText }],
353
+ structuredContent: structured,
354
+ };
355
+ }
356
+ catch (error) {
357
+ return {
358
+ content: [{ type: "text", text: formatAwsError(error) }],
359
+ isError: true,
360
+ };
361
+ }
362
+ });
363
+ // ── Start ─────────────────────────────────────────────────────────────────────
364
+ async function main() {
365
+ // Warn (but don't exit) if no default KB ID — users can still pass it per-call
366
+ if (!DEFAULT_KB_ID) {
367
+ console.error("WARNING: BEDROCK_KNOWLEDGE_BASE_ID is not set. " +
368
+ "You must pass 'knowledge_base_id' in every tool call, or set the env var.");
369
+ }
370
+ const transport = new StdioServerTransport();
371
+ await server.connect(transport);
372
+ console.error("Bedrock MCP Server running via stdio");
373
+ }
374
+ main().catch((error) => {
375
+ console.error("Fatal error:", error);
376
+ process.exit(1);
377
+ });
378
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { BedrockAgentRuntimeClient, type RetrievalResultLocation } from "@aws-sdk/client-bedrock-agent-runtime";
2
+ export declare function getBedrockClient(): BedrockAgentRuntimeClient;
3
+ export interface RetrievedPassage {
4
+ content: string;
5
+ score: number | undefined;
6
+ location: RetrievalResultLocation | undefined;
7
+ metadata: Record<string, unknown> | undefined;
8
+ }
9
+ export interface RetrieveResult {
10
+ passages: RetrievedPassage[];
11
+ nextToken: string | undefined;
12
+ }
13
+ export interface RetrieveAndGenerateResult {
14
+ output: string;
15
+ sessionId: string | undefined;
16
+ citations: Citation[];
17
+ }
18
+ export interface Citation {
19
+ generatedText: string | undefined;
20
+ passages: RetrievedPassage[];
21
+ }
22
+ export interface RetrieveParams {
23
+ knowledgeBaseId: string;
24
+ query: string;
25
+ numberOfResults?: number;
26
+ searchType?: "SEMANTIC" | "HYBRID";
27
+ nextToken?: string;
28
+ metadataFilter?: Record<string, unknown>;
29
+ }
30
+ export declare function retrieve(params: RetrieveParams): Promise<RetrieveResult>;
31
+ export interface RetrieveAndGenerateParams {
32
+ knowledgeBaseId: string;
33
+ modelArn: string;
34
+ query: string;
35
+ numberOfResults?: number;
36
+ searchType?: "SEMANTIC" | "HYBRID";
37
+ sessionId?: string;
38
+ systemPrompt?: string;
39
+ }
40
+ export declare function retrieveAndGenerate(params: RetrieveAndGenerateParams): Promise<RetrieveAndGenerateResult>;
41
+ export declare function formatAwsError(error: unknown): string;
42
+ //# sourceMappingURL=bedrock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../src/services/bedrock.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EAKzB,KAAK,uBAAuB,EAE7B,MAAM,uCAAuC,CAAC;AAY/C,wBAAgB,gBAAgB,IAAI,yBAAyB,CAQ5D;AAID,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAID,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAgC9E;AAID,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,yBAAyB,CAAC,CAgDpC;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAuBrD"}
@@ -0,0 +1,115 @@
1
+ import { BedrockAgentRuntimeClient, RetrieveCommand, RetrieveAndGenerateCommand, } from "@aws-sdk/client-bedrock-agent-runtime";
2
+ import { fromIni } from "@aws-sdk/credential-providers";
3
+ // ── Configuration ────────────────────────────────────────────────────────────
4
+ const AWS_REGION = process.env.AWS_REGION ?? "us-east-1";
5
+ const AWS_PROFILE = process.env.AWS_PROFILE ?? "default";
6
+ // ── Client (singleton) ───────────────────────────────────────────────────────
7
+ let _client = null;
8
+ export function getBedrockClient() {
9
+ if (!_client) {
10
+ _client = new BedrockAgentRuntimeClient({
11
+ region: AWS_REGION,
12
+ credentials: fromIni({ profile: AWS_PROFILE }),
13
+ });
14
+ }
15
+ return _client;
16
+ }
17
+ export async function retrieve(params) {
18
+ const client = getBedrockClient();
19
+ const input = {
20
+ knowledgeBaseId: params.knowledgeBaseId,
21
+ retrievalQuery: { text: params.query },
22
+ retrievalConfiguration: {
23
+ vectorSearchConfiguration: {
24
+ numberOfResults: params.numberOfResults ?? 5,
25
+ ...(params.searchType ? { overrideSearchType: params.searchType } : {}),
26
+ ...(params.metadataFilter
27
+ ? { filter: params.metadataFilter }
28
+ : {}),
29
+ },
30
+ },
31
+ ...(params.nextToken ? { nextToken: params.nextToken } : {}),
32
+ };
33
+ const command = new RetrieveCommand(input);
34
+ const response = await client.send(command);
35
+ const passages = (response.retrievalResults ?? []).map((r) => ({
36
+ content: r.content?.text ?? "",
37
+ score: r.score,
38
+ location: r.location,
39
+ metadata: r.metadata,
40
+ }));
41
+ return {
42
+ passages,
43
+ nextToken: response.nextToken,
44
+ };
45
+ }
46
+ export async function retrieveAndGenerate(params) {
47
+ const client = getBedrockClient();
48
+ const input = {
49
+ input: { text: params.query },
50
+ retrieveAndGenerateConfiguration: {
51
+ type: "KNOWLEDGE_BASE",
52
+ knowledgeBaseConfiguration: {
53
+ knowledgeBaseId: params.knowledgeBaseId,
54
+ modelArn: params.modelArn,
55
+ retrievalConfiguration: {
56
+ vectorSearchConfiguration: {
57
+ numberOfResults: params.numberOfResults ?? 5,
58
+ ...(params.searchType ? { overrideSearchType: params.searchType } : {}),
59
+ },
60
+ },
61
+ ...(params.systemPrompt
62
+ ? {
63
+ generationConfiguration: {
64
+ promptTemplate: {
65
+ textPromptTemplate: params.systemPrompt,
66
+ },
67
+ },
68
+ }
69
+ : {}),
70
+ },
71
+ },
72
+ ...(params.sessionId ? { sessionId: params.sessionId } : {}),
73
+ };
74
+ const command = new RetrieveAndGenerateCommand(input);
75
+ const response = await client.send(command);
76
+ const citations = (response.citations ?? []).map((c) => ({
77
+ generatedText: c.generatedResponsePart?.textResponsePart?.text,
78
+ passages: (c.retrievedReferences ?? []).map((ref) => ({
79
+ content: ref.content?.text ?? "",
80
+ score: undefined,
81
+ location: ref.location,
82
+ metadata: ref.metadata,
83
+ })),
84
+ }));
85
+ return {
86
+ output: response.output?.text ?? "",
87
+ sessionId: response.sessionId,
88
+ citations,
89
+ };
90
+ }
91
+ // ── Error helper ─────────────────────────────────────────────────────────────
92
+ export function formatAwsError(error) {
93
+ if (error instanceof Error) {
94
+ const name = error.name;
95
+ const msg = error.message;
96
+ if (name === "ResourceNotFoundException") {
97
+ return `Error: Knowledge Base not found. Check that BEDROCK_KNOWLEDGE_BASE_ID is correct and the KB exists in region ${AWS_REGION}.`;
98
+ }
99
+ if (name === "AccessDeniedException") {
100
+ return `Error: Access denied. Ensure the AWS profile '${AWS_PROFILE}' has the 'bedrock:Retrieve' and 'bedrock:RetrieveAndGenerate' IAM permissions.`;
101
+ }
102
+ if (name === "ValidationException") {
103
+ return `Error: Invalid request — ${msg}. Check the parameters and try again.`;
104
+ }
105
+ if (name === "ThrottlingException") {
106
+ return "Error: AWS request throttled. Wait a moment and retry.";
107
+ }
108
+ if (name === "CredentialsProviderError") {
109
+ return `Error: Could not load AWS credentials for profile '${AWS_PROFILE}'. Run 'aws sso login --profile ${AWS_PROFILE}' or check your ~/.aws/credentials file.`;
110
+ }
111
+ return `Error [${name}]: ${msg}`;
112
+ }
113
+ return `Error: ${String(error)}`;
114
+ }
115
+ //# sourceMappingURL=bedrock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/services/bedrock.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@miguel-carrera/aws-bedrock-mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for AWS Bedrock Knowledge Base — semantic search and RAG via bedrock_retrieve and bedrock_retrieve_and_generate",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "aws-bedrock-mcp-server": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "start": "node dist/index.js",
16
+ "dev": "tsx watch src/index.ts",
17
+ "build": "tsc",
18
+ "clean": "rm -rf dist",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "aws",
27
+ "bedrock",
28
+ "knowledge-base",
29
+ "rag",
30
+ "claude"
31
+ ],
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/miguelcarrera/aws-bedrock-mcp-server.git"
36
+ },
37
+ "homepage": "https://github.com/miguelcarrera/aws-bedrock-mcp-server#readme",
38
+ "dependencies": {
39
+ "@aws-sdk/client-bedrock-agent-runtime": "^3.758.0",
40
+ "@aws-sdk/credential-providers": "^3.758.0",
41
+ "@modelcontextprotocol/sdk": "^1.6.1",
42
+ "zod": "^3.23.8"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.10.0",
46
+ "tsx": "^4.19.2",
47
+ "typescript": "^5.7.2"
48
+ }
49
+ }