iteratools-mcp 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 +83 -0
- package/index.js +123 -0
- package/package.json +29 -0
- package/smithery.yaml +15 -0
package/README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# IteraTools MCP Server
|
|
2
|
+
|
|
3
|
+
> Production-ready MCP server with 40+ tools for AI agents — QR codes, PDFs, text processing, TTS, web scraping, image generation and more.
|
|
4
|
+
|
|
5
|
+
[](https://iteratools.com)
|
|
6
|
+
[](https://iteratools.com)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
|
|
9
|
+
## What is IteraTools?
|
|
10
|
+
|
|
11
|
+
IteraTools is a production-ready API platform providing ready-to-use utilities for AI agents and developers. With a single API key, access 40+ tools via the Model Context Protocol (MCP).
|
|
12
|
+
|
|
13
|
+
Uses **x402 micropayments** on Base — no subscription needed, pay per use in USDC.
|
|
14
|
+
|
|
15
|
+
## Available Tools
|
|
16
|
+
|
|
17
|
+
| Category | Tools |
|
|
18
|
+
|----------|-------|
|
|
19
|
+
| 🖼️ Images | Generate (Flux 1.1 Pro), fast generate, background removal (rembg), resize, OCR |
|
|
20
|
+
| 🎬 Video | Generate (Kling), extract frames |
|
|
21
|
+
| 📄 PDF | Extract text, generate from HTML |
|
|
22
|
+
| 🌐 Web | Scrape, screenshot, search |
|
|
23
|
+
| 🔊 Audio | TTS (text-to-speech), transcription |
|
|
24
|
+
| 📱 WhatsApp | Send template, reply in conversation |
|
|
25
|
+
| 🔧 Utils | QR code, URL shortener, email validate, weather, crypto price, code execution |
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
### Claude Desktop
|
|
30
|
+
|
|
31
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"mcpServers": {
|
|
36
|
+
"iteratools": {
|
|
37
|
+
"command": "npx",
|
|
38
|
+
"args": ["-y", "@iteratools/mcp"],
|
|
39
|
+
"env": {
|
|
40
|
+
"ITERATOOLS_API_KEY": "your-api-key"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Get API Key
|
|
48
|
+
|
|
49
|
+
1. Visit [iteratools.com](https://iteratools.com)
|
|
50
|
+
2. Sign up for free
|
|
51
|
+
3. Copy your API key
|
|
52
|
+
|
|
53
|
+
### Example Usage
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Generate a QR code
|
|
57
|
+
curl -X POST https://api.iteratools.com/qrcode \
|
|
58
|
+
-H "X-API-Key: your-key" \
|
|
59
|
+
-d '{"text": "https://iteratools.com"}'
|
|
60
|
+
|
|
61
|
+
# Generate an image
|
|
62
|
+
curl -X POST https://api.iteratools.com/image/generate \
|
|
63
|
+
-H "X-API-Key: your-key" \
|
|
64
|
+
-d '{"prompt": "a sunset over mountains"}'
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Pricing
|
|
68
|
+
|
|
69
|
+
Pay per use — no subscription:
|
|
70
|
+
|
|
71
|
+
| Tool | Price |
|
|
72
|
+
|------|-------|
|
|
73
|
+
| Image generate (Flux 1.1 Pro) | $0.005 |
|
|
74
|
+
| Image fast | $0.002 |
|
|
75
|
+
| Video generate | $0.05 |
|
|
76
|
+
| PDF/Web/Utils tools | $0.001–0.003 |
|
|
77
|
+
|
|
78
|
+
## Links
|
|
79
|
+
|
|
80
|
+
- 🌐 [Website](https://iteratools.com)
|
|
81
|
+
- 📚 [API Documentation](https://iteratools.com/docs)
|
|
82
|
+
- 🐙 [GitHub](https://github.com/fredpsantos33/iteratools-mcp)
|
|
83
|
+
- 💬 [Support](https://iteratools.com/support)
|
package/index.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* IteraTools MCP Server
|
|
4
|
+
* 40+ pay-per-use API tools for AI agents
|
|
5
|
+
* https://iteratools.com
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
9
|
+
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
10
|
+
const { CallToolRequestSchema, ListToolsRequestSchema } = require('@modelcontextprotocol/sdk/types.js');
|
|
11
|
+
|
|
12
|
+
const BASE_URL = 'https://api.iteratools.com';
|
|
13
|
+
const API_KEY = process.env.ITERATOOLS_API_KEY || '';
|
|
14
|
+
|
|
15
|
+
const TOOLS = [
|
|
16
|
+
// Images
|
|
17
|
+
{ name: 'image_generate', description: 'Generate an image using Flux 1.1 Pro AI model', inputSchema: { type: 'object', properties: { prompt: { type: 'string', description: 'Image description' }, width: { type: 'number', default: 1024 }, height: { type: 'number', default: 1024 } }, required: ['prompt'] }, endpoint: '/image/generate', price: '$0.005' },
|
|
18
|
+
{ name: 'image_fast', description: 'Generate an image quickly using Flux Schnell (faster, cheaper)', inputSchema: { type: 'object', properties: { prompt: { type: 'string' }, width: { type: 'number', default: 1024 }, height: { type: 'number', default: 1024 } }, required: ['prompt'] }, endpoint: '/image/fast', price: '$0.002' },
|
|
19
|
+
{ name: 'image_rembg', description: 'Remove background from an image', inputSchema: { type: 'object', properties: { url: { type: 'string', description: 'Image URL' } }, required: ['url'] }, endpoint: '/image/rembg', price: '$0.003' },
|
|
20
|
+
{ name: 'image_resize', description: 'Resize an image to specified dimensions', inputSchema: { type: 'object', properties: { url: { type: 'string' }, width: { type: 'number' }, height: { type: 'number' } }, required: ['url', 'width', 'height'] }, endpoint: '/image/resize', price: '$0.001' },
|
|
21
|
+
{ name: 'image_ocr', description: 'Extract text from an image using OCR', inputSchema: { type: 'object', properties: { url: { type: 'string', description: 'Image URL' } }, required: ['url'] }, endpoint: '/image/ocr', price: '$0.002' },
|
|
22
|
+
// Video
|
|
23
|
+
{ name: 'video_generate', description: 'Generate a short video from a prompt using Kling AI', inputSchema: { type: 'object', properties: { prompt: { type: 'string' }, duration: { type: 'number', default: 5 } }, required: ['prompt'] }, endpoint: '/video/generate', price: '$0.05' },
|
|
24
|
+
// Audio
|
|
25
|
+
{ name: 'tts', description: 'Convert text to speech (MP3)', inputSchema: { type: 'object', properties: { text: { type: 'string' }, voice: { type: 'string', default: 'alloy' } }, required: ['text'] }, endpoint: '/tts', price: '$0.002' },
|
|
26
|
+
{ name: 'audio_transcribe', description: 'Transcribe audio from a URL using Whisper AI', inputSchema: { type: 'object', properties: { url: { type: 'string', description: 'URL of audio file (mp3/mp4/wav/ogg/webm)' }, language: { type: 'string', description: 'Language code (e.g. en, pt)', default: 'en' } }, required: ['url'] }, endpoint: '/audio/transcribe', price: '$0.003/min' },
|
|
27
|
+
// Web
|
|
28
|
+
{ name: 'scrape', description: 'Scrape and extract text content from a URL', inputSchema: { type: 'object', properties: { url: { type: 'string' } }, required: ['url'] }, endpoint: '/scrape', price: '$0.001' },
|
|
29
|
+
{ name: 'screenshot', description: 'Take a screenshot of a webpage', inputSchema: { type: 'object', properties: { url: { type: 'string' } }, required: ['url'] }, endpoint: '/screenshot', price: '$0.003' },
|
|
30
|
+
{ name: 'search', description: 'Search the web and return results', inputSchema: { type: 'object', properties: { query: { type: 'string' }, count: { type: 'number', default: 5 } }, required: ['query'] }, endpoint: '/search', price: '$0.002' },
|
|
31
|
+
{ name: 'browser_act', description: 'Automate browser actions (click, fill, extract, navigate)', inputSchema: { type: 'object', properties: { actions: { type: 'array', description: 'List of actions: {type, url/selector/text/script}', items: { type: 'object' } } }, required: ['actions'] }, endpoint: '/browser/act', price: '$0.005' },
|
|
32
|
+
// PDF
|
|
33
|
+
{ name: 'pdf_extract', description: 'Extract text from a PDF file', inputSchema: { type: 'object', properties: { url: { type: 'string', description: 'PDF URL' } }, required: ['url'] }, endpoint: '/pdf/extract', price: '$0.003' },
|
|
34
|
+
{ name: 'pdf_generate', description: 'Generate a PDF from HTML content', inputSchema: { type: 'object', properties: { html: { type: 'string' } }, required: ['html'] }, endpoint: '/pdf/generate', price: '$0.003' },
|
|
35
|
+
// Utils
|
|
36
|
+
{ name: 'qrcode', description: 'Generate a QR code image', inputSchema: { type: 'object', properties: { text: { type: 'string', description: 'Text or URL to encode' }, size: { type: 'number', default: 300 } }, required: ['text'] }, endpoint: '/qrcode', price: '$0.001' },
|
|
37
|
+
{ name: 'url_shorten', description: 'Shorten a URL', inputSchema: { type: 'object', properties: { url: { type: 'string' } }, required: ['url'] }, endpoint: '/url/shorten', price: '$0.001' },
|
|
38
|
+
{ name: 'email_validate', description: 'Validate an email address (format + MX check)', inputSchema: { type: 'object', properties: { email: { type: 'string' } }, required: ['email'] }, endpoint: '/email/validate', price: '$0.001' },
|
|
39
|
+
{ name: 'weather', description: 'Get current weather and forecast for a location', inputSchema: { type: 'object', properties: { location: { type: 'string', description: 'City name or coordinates' } }, required: ['location'] }, endpoint: '/weather', price: '$0.001' },
|
|
40
|
+
{ name: 'crypto_price', description: 'Get current cryptocurrency price', inputSchema: { type: 'object', properties: { coin: { type: 'string', default: 'bitcoin', description: 'Coin name (e.g. bitcoin, ethereum)' } }, required: [] }, endpoint: '/crypto/price', price: '$0.001' },
|
|
41
|
+
{ name: 'translate', description: 'Translate text to another language', inputSchema: { type: 'object', properties: { text: { type: 'string' }, target_lang: { type: 'string', description: 'Target language code (e.g. pt, es, fr)' }, source_lang: { type: 'string', default: 'auto' } }, required: ['text', 'target_lang'] }, endpoint: '/translate', price: '$0.001' },
|
|
42
|
+
{ name: 'dns_lookup', description: 'Lookup DNS records for a domain', inputSchema: { type: 'object', properties: { domain: { type: 'string' }, types: { type: 'array', items: { type: 'string' }, default: ['A', 'MX', 'TXT'] } }, required: ['domain'] }, endpoint: '/dns/lookup', price: '$0.001' },
|
|
43
|
+
{ name: 'spreadsheet_generate', description: 'Generate an Excel or CSV spreadsheet', inputSchema: { type: 'object', properties: { format: { type: 'string', enum: ['xlsx', 'csv'], default: 'xlsx' }, filename: { type: 'string', default: 'report' }, sheets: { type: 'array', description: 'Array of {name, headers, rows}', items: { type: 'object' } } }, required: ['sheets'] }, endpoint: '/spreadsheet/generate', price: '$0.003' },
|
|
44
|
+
{ name: 'chart_generate', description: 'Generate a chart image (bar, line, pie, etc.)', inputSchema: { type: 'object', properties: { type: { type: 'string', enum: ['bar', 'line', 'pie', 'doughnut', 'radar'] }, labels: { type: 'array', items: { type: 'string' } }, datasets: { type: 'array', items: { type: 'object' } }, title: { type: 'string' } }, required: ['type', 'labels', 'datasets'] }, endpoint: '/chart/generate', price: '$0.002' },
|
|
45
|
+
{ name: 'code_execute', description: 'Execute Python or JavaScript code in a sandbox', inputSchema: { type: 'object', properties: { code: { type: 'string' }, language: { type: 'string', enum: ['python', 'javascript'], default: 'python' } }, required: ['code'] }, endpoint: '/code/execute', price: '$0.01' },
|
|
46
|
+
// WhatsApp
|
|
47
|
+
{ name: 'whatsapp_send', description: 'Send a WhatsApp message using a pre-approved template', inputSchema: { type: 'object', properties: { to: { type: 'string', description: 'Phone number with country code (e.g. +15551234567)' }, template: { type: 'string' }, language: { type: 'string', default: 'en_US' }, params: { type: 'array', items: { type: 'string' } } }, required: ['to', 'template'] }, endpoint: '/whatsapp/send', price: '$0.005' },
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
async function callTool(endpoint, params) {
|
|
51
|
+
const fetch = (await import('node-fetch')).default;
|
|
52
|
+
const isGet = ['GET'].includes((TOOLS.find(t => t.endpoint === endpoint) || {}).method);
|
|
53
|
+
|
|
54
|
+
const url = isGet
|
|
55
|
+
? `${BASE_URL}${endpoint}?${new URLSearchParams(params)}`
|
|
56
|
+
: `${BASE_URL}${endpoint}`;
|
|
57
|
+
|
|
58
|
+
const res = await fetch(url, {
|
|
59
|
+
method: isGet ? 'GET' : 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
'Authorization': `Bearer ${API_KEY}`,
|
|
63
|
+
},
|
|
64
|
+
body: isGet ? undefined : JSON.stringify(params),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const text = await res.text();
|
|
68
|
+
let data;
|
|
69
|
+
try { data = JSON.parse(text); } catch { data = { raw: text }; }
|
|
70
|
+
|
|
71
|
+
if (!res.ok) {
|
|
72
|
+
if (res.status === 402) {
|
|
73
|
+
throw new Error(`Insufficient credits. Add credits at https://iteratools.com. Cost: ${TOOLS.find(t=>t.endpoint===endpoint)?.price || 'see docs'}`);
|
|
74
|
+
}
|
|
75
|
+
throw new Error(`API error ${res.status}: ${text.substring(0, 200)}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return data;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const server = new Server(
|
|
82
|
+
{ name: 'iteratools', version: '1.0.0' },
|
|
83
|
+
{ capabilities: { tools: {} } }
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
87
|
+
tools: TOOLS.map(t => ({
|
|
88
|
+
name: t.name,
|
|
89
|
+
description: `${t.description} (${t.price})`,
|
|
90
|
+
inputSchema: t.inputSchema,
|
|
91
|
+
})),
|
|
92
|
+
}));
|
|
93
|
+
|
|
94
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
95
|
+
const { name, arguments: args } = request.params;
|
|
96
|
+
|
|
97
|
+
if (!API_KEY) {
|
|
98
|
+
return {
|
|
99
|
+
content: [{ type: 'text', text: 'Error: ITERATOOLS_API_KEY environment variable not set. Get a key at https://iteratools.com' }],
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const tool = TOOLS.find(t => t.name === name);
|
|
105
|
+
if (!tool) {
|
|
106
|
+
return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const result = await callTool(tool.endpoint, args);
|
|
111
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
112
|
+
} catch (err) {
|
|
113
|
+
return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
async function main() {
|
|
118
|
+
const transport = new StdioServerTransport();
|
|
119
|
+
await server.connect(transport);
|
|
120
|
+
console.error('IteraTools MCP server running. Set ITERATOOLS_API_KEY env var.');
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
main().catch(console.error);
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "iteratools-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for IteraTools — 40+ pay-per-use API tools for AI agents",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"iteratools-mcp": "./index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "node index.js"
|
|
11
|
+
},
|
|
12
|
+
"keywords": ["mcp", "ai", "agents", "api", "tools", "iteratools", "model-context-protocol"],
|
|
13
|
+
"author": "Iterasoft",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"homepage": "https://iteratools.com",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/fredpsantos33/iteratools-mcp.git"
|
|
19
|
+
},
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/fredpsantos33/iteratools-mcp/issues"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
}
|
|
29
|
+
}
|
package/smithery.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# IteraTools MCP Server configuration
|
|
2
|
+
# https://smithery.ai/docs/config
|
|
3
|
+
|
|
4
|
+
startCommand:
|
|
5
|
+
type: http
|
|
6
|
+
configSchema:
|
|
7
|
+
type: object
|
|
8
|
+
properties:
|
|
9
|
+
apiKey:
|
|
10
|
+
type: string
|
|
11
|
+
description: Your IteraTools API key (get one at https://iteratools.com)
|
|
12
|
+
required: []
|
|
13
|
+
exampleConfig:
|
|
14
|
+
apiKey: "your-api-key"
|
|
15
|
+
url: https://iteratools--iterasoft.run.tools
|