Model Context Protocol server that offers a 'James' second-opinion review tool.
Project description
ask-james
Get a second opinion from another LLM — without leaving your assistant.
ask-james is an MCP server that lets any AI assistant (Claude, Kiro, Cursor, etc.) call out to a different LLM for a critical review. Say "ask James what he thinks" and get structured feedback on your plan before you commit.
Example
Here's James in action during a Kiro CLI session:
> I need a list of POI in Paris using OpenStreetMap
Kiro: I'll create a Python script using the Overpass API...
def get_paris_poi():
query = """
[out:json][timeout:25];
(
node["tourism"~"attraction|museum|monument|viewpoint"]["name"](area:3600071525);
way["tourism"~"attraction|museum|monument|viewpoint"]["name"](area:3600071525);
);
out center meta;
"""
# ... fetch and parse response
> Ask James for a second opinion
James:
Your approach has solid foundations but several issues:
Key concerns:
- Filtering is too narrow — only tourism tags will miss landmarks
tagged as historic, amenity, or leisure
- Ways/relations don't have direct coordinates — you need out center;
- "Top 50" is meaningless without defining how to rank POIs
What looks solid:
- Using Overpass API is the right approach
- Querying nodes/ways/relations is correct
Questions:
- What exactly counts as a POI for your use case?
- How should results be sorted — by name, importance, distance?
- Paris city proper or greater metro area?
The assistant proposed code. James caught the gaps. Now you can decide with full context.
Think about your last implementation — would a second opinion have saved you time?
Quick start
Add this to your MCP host config:
{
"command": "uvx",
"args": ["ask-james"],
"env": {
"ASK_JAMES_API_KEY": "your-api-key",
"ASK_JAMES_MODEL": "gpt-4o"
}
}
That's it. uvx downloads and runs the package automatically.
How it works
┌─────────────┐ "ask James" ┌─────────────┐
│ Claude │ ──────────────────► │ ask-james │
│ / Kiro │ │ (MCP server)│
│ / Cursor │ ◄────────────────── │ │
└─────────────┘ critique back └──────┬──────┘
│
▼
┌─────────────┐
│ Any LLM │
│ (via LiteLLM)│
└─────────────┘
- Your assistant sends the proposal to James via MCP
- James (powered by any LLM you choose) reviews it critically
- You get structured feedback: concerns, positives, questions, next steps
- James never rewrites — he only critiques
Pro tip: Use two different frontier models for best results. For example, Claude Opus 4.5 as your primary assistant with GPT-5.2 as James — or vice versa. Different models catch different blind spots.
Configuration
| Variable | Description |
|---|---|
ASK_JAMES_MODEL |
Model to use (e.g., gpt-4o, claude-3-5-sonnet-20241022) |
ASK_JAMES_API_KEY |
Your API key (works with any provider) |
Ask James supports any model supported by LiteLLM — OpenAI, Anthropic, Google, Azure, Ollama, and 100+ others.
Or omit ASK_JAMES_API_KEY and set the provider's native variable (OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.) — LiteLLM picks it up automatically.
When to use James
- Implementation plans — Before blindly following an assistant's architecture
- High-stakes changes — Deploys, refunds, irreversible operations
- Decisions under uncertainty — When you want a dissenting view
- Code review — Quick sanity check on proposed changes
Host configurations
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"ask-james": {
"command": "uvx",
"args": ["ask-james"],
"env": {
"ASK_JAMES_API_KEY": "your-api-key",
"ASK_JAMES_MODEL": "gpt-4o"
}
}
}
}
Kiro
Settings → MCP Tools:
{
"id": "ask-james",
"name": "Ask James",
"command": "uvx",
"args": ["ask-james"],
"env": {
"ASK_JAMES_API_KEY": "your-api-key",
"ASK_JAMES_MODEL": "gpt-4o"
}
}
Cursor / Windsurf
mcp-tools.json:
{
"tools": [
{
"name": "Ask James",
"command": "uvx",
"args": ["ask-james"],
"env": {
"ASK_JAMES_API_KEY": "your-api-key",
"ASK_JAMES_MODEL": "gpt-4o"
}
}
]
}
Prompting tips
Just tell your assistant to ask James:
- "Ask James to critique this plan"
- "Get a second opinion from James before we proceed"
- "Have James review this code"
Development
pip install -e .
python -m ask_james # manual stdio testing
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ask_james-0.1.1.tar.gz.
File metadata
- Download URL: ask_james-0.1.1.tar.gz
- Upload date:
- Size: 6.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e1f98cbdd404e3051521dcd3ac1c66377fff15a744b39d82d68e29ff22c006fd
|
|
| MD5 |
18e22a8e11b8ea34020897c8af71a624
|
|
| BLAKE2b-256 |
27aac523aef30d518a31f8e85c70ad427e71f5475496d9c355e632d786618a77
|
File details
Details for the file ask_james-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ask_james-0.1.1-py3-none-any.whl
- Upload date:
- Size: 6.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
668b2ff5874c971a67572e82942893eb4c9c80d87f0e86893f3a0913891c13ab
|
|
| MD5 |
6487387eca945664300c1a93e5faa7a7
|
|
| BLAKE2b-256 |
aeb6050643c0cd815369ede5e06a44c04ab80fc04a473525ec89de48de3a90c9
|