Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@qmcpconnect to port 5000 and show me the schema for the trade table"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
qmcp Server
A Model Context Protocol (MCP) server for q/kdb+ integration.
MCP is an open protocol created by Anthropic that enables AI systems to interact with external tools and data sources. While currently supported by Claude (Desktop and CLI), the open standard allows other LLMs to adopt it in the future.
Open-Source Proof-of-Concept
This repository contains an open-source proof-of-concept demonstrating the core qmcp approach. The Qython translation tool (available at github.com/gabiteodoru/qython) covers ~5% of the q language and is provided for evaluation and experimentation.
Production Results: The full Qython implementation achieves 0.6% failure rate on HumanEval benchmarks, with 10x reliability improvement over native q development. See the complete evaluation: 0.6% Failure Rate: Solving LLM Code Generation for q/kdb+
Commercial Licensing: For access to the full Qython implementation with comprehensive language coverage, contact gabiteodoru@gmail.com
Features
Connect to q/kdb+ servers
Execute q queries and commands
Persistent connection management
Intelligent async query handling with configurable timeouts
Programmatic query cancellation (Ctrl+C equivalent)
Graceful handling of long-running queries
NEW: Qython language translator (Experimental Alpha)
Windows Users: WSL Recommendation
⚠️ Important for Windows users: For optimal functionality, it is highly recommended to run both the MCP server and your q session inside WSL (Windows Subsystem for Linux). This ensures the server can interrupt infinite loops and runaway queries that LLMs might accidentally generate.
Running the MCP server on Windows (outside WSL) disables SIGINT-based query interruption functionality, which is critical for escaping problematic queries during AI-assisted development sessions.
Architecture & Design Philosophy
Intended Goals
qmcp is designed to provide AI coding assistants with controlled access to q/kdb+ databases for development and debugging workflows:
Development-Focused: Optimized for coding tools working with debug/dev q servers
Query Control: AI can interrupt long-running queries (equivalent to developer Ctrl+C)
Predictable Behavior: Sequential execution prevents resource conflicts during development
Configurable Timeouts: Customizable timing for different development scenarios
Design Logic
The server architecture makes deliberate choices for AI-assisted development workflows:
Single Connection Model
Why: Simplifies development debugging - one connection, clear state
Benefit: Matches typical developer workflow with single q session
Implementation: One persistent connection per MCP session
Sequential Query Execution
Why: Development environments don't need concurrent query support
Benefit: Predictable resource usage, easier debugging, prevents query interference
Implementation: New queries rejected while another is running
Smart Async Switching with Configurable Timeouts
Why: Keeps AI coding sessions responsive while allowing complex development queries
Benefit: Immediate feedback for quick queries, progress tracking for analysis
Customization: All timeouts configurable via MCP tools
AI-Controlled Query Interruption
Why: AI coding tools need ability to cancel runaway queries (like developer Ctrl+C)
How: MCP server locates q process by port and sends SIGINT after configurable timeout
Benefit: Prevents development sessions from hanging on problematic queries
Limitations: SIGINT functionality disabled when:
MCP server runs on Windows (outside WSL)
MCP server and q session run on opposite sides of WSL/Windows divide
Development-Oriented Process Management
Why: Coding tools work with user-managed development q servers
Benefit: Developer controls q server lifecycle, AI controls query execution
Design: MCP server provides query interruption capability without server lifecycle management
Why This Design Makes Sense for Coding Tools
Development Workflow: Matches how developers interact with q - single session, iterative queries
AI Safety: Prevents AI from overwhelming development environments with concurrent requests
Debugging-Friendly: Sequential execution makes it easier to trace issues
Responsive: Async handling prevents AI coding sessions from blocking
Configurable: Timeouts can be tuned for different development scenarios
This architecture provides AI coding assistants with effective q/kdb+ access while maintaining the predictable, controlled environment that development workflows require.
Requirements
Python 3.8+
Access to a q/kdb+ server
uv(for lightweight installation) orpip(for full installation)
Quick Start
For first-time users, the fastest way to get started:
Start a q server:
q -p 5001Add qmcp to Claude CLI:
claude mcp add qmcp "uv run qmcp/server.py"Start using Claude CLI:
claudeThen interact with qmcp:
> connect to port 5001 and compute 2+2 ● qmcp:connect_to_q (MCP)(host: "5001") ⎿ true ● qmcp:query_q (MCP)(command: "2+2") ⎿ 4
Installation
Lightweight Installation (Claude CLI only)
Run directly with uv (no pip installation required, may be slower on startup; best for trying it out at first):
Full Installation
Option 1: pip (recommended for global use)
Note: Consider using a virtual environment to avoid dependency conflicts:
Option 2: uv (for project-specific use)
Adding to Claude CLI
After full installation, add the server to Claude CLI:
Adding to Claude Desktop
Add to your Claude Desktop configuration file:
For uv-based installation:
Usage
Starting the MCP Server
After full installation:
With lightweight installation: The server starts automatically when Claude CLI uses it (no manual start needed).
Environment Variables
Q_DEFAULT_HOST- Default connection info in format:host,host:port, orhost:port:user:passwd
Connection Fallback Logic
The connect_to_q(host) tool uses flexible fallback logic:
Full connection string (has colons): Use directly, ignore
Q_DEFAULT_HOSTconnect_to_q("myhost:5001:user:pass")
Port number only: Combine with
Q_DEFAULT_HOSTor uselocalhostconnect_to_q(5001)→ UsesQ_DEFAULT_HOSTsettings with port 5001
No parameters: Use
Q_DEFAULT_HOSTdirectlyconnect_to_q()→ UsesQ_DEFAULT_HOSTas-is
Hostname only: Use as hostname with
Q_DEFAULT_HOSTport/auth or default portconnect_to_q("myhost")→ Combines withQ_DEFAULT_HOSTsettings
Tool Stability Status
Production-Ready Tools:
connect_to_q- Stable connection management with fallback logicquery_q- Execute queries with intelligent async timeout controlset_timeout_switch_to_async- Configure when queries switch to async modeset_timeout_interrupt_q- Configure when to send SIGINT to cancel queriesset_timeout_connection- Configure connection timeoutget_timeout_settings- View current timeout configurationget_current_task_status- Check status of running async queryget_current_task_result- Retrieve result of completed async queryinterrupt_current_query- Send SIGINT to interrupt running queries
Experimental Tools (Alpha):
translate_qython_to_q- ⚠️ EXPERIMENTAL: Python-like syntax to q translatorQython supports:
do n times:,converge(),partial(),reduce(),arange()Assumes imports:
from functools import partial,from numpy import arangeEncourages vectorized, numpy-style operations over basic Python loops
Limited vocabulary, may produce incorrect code
Please verify all output before use
translate_q_to_qython- ⚠️ EXPERIMENTAL: Q code to Python-like translator with AI disambiguationUses ParseQ to convert q expressions into readable, well-documented Python-like code
Parses q AST, flattens nested calls, and uses AI to disambiguate overloaded operators
Requires q connection first - run
connect_to_qtool before using (uses q's own parser)Namespace Impact: Creates variables and functions in the
.parseqnamespace of your q sessionHardwired to Claude Code CLI - unlike other tools that work with any MCP-compatible LLM, this tool specifically calls Claude Code CLI for AI disambiguation
May produce incorrect translations, especially for complex expressions
Please verify all output before use
Report bugs at GitHub Issues
Known Limitations
When using the MCP server, be aware of these limitations:
Query Interruption (SIGINT) Limitations
Windows Platform: Query interruption disabled when MCP server runs on Windows (outside WSL)
Cross-Platform Setup: Query interruption disabled when MCP server and q session run on opposite sides of WSL/Windows divide
Impact: LLM cannot automatically escape infinite loops or cancel runaway queries in these configurations
Data Conversion Limitations
Keyed tables: Operations like
1!tablemay fail during pandas conversionString vs Symbol distinction: q strings and symbols may appear identical in output
Type ambiguity: Use q's
metaandtypecommands to determine actual data types when precision mattersPandas conversion: Some q-specific data structures may not convert properly to pandas DataFrames
For type checking, use:
WSL2 Port Communication (Windows Users)
Skip this section if you're not on Windows.
Since Claude CLI is WSL-only on Windows, but you might want to use Windows IDEs or tools to connect to your q server, you need proper port communication between WSL2 and Windows.
WSL2 Configuration for Port Communication
.wslconfig File Setup
Location: C:\Users\{YourUsername}\.wslconfig
Add mirrored networking configuration:
Restart WSL2
Run from Windows PowerShell/CMD (NOT from within WSL):
Verify Configuration
Check if mirrored networking is active:
Test Port Communication
Test WSL2 → Windows (localhost):
Test Windows → WSL2 (localhost):
What Mirrored Networking Provides
✅ Direct localhost communication both ways
✅ No manual port forwarding needed
✅ Better VPN compatibility
✅ Simplified networking (Windows and WSL2 share network interfaces)
✅ Firewall rules automatically handled
⚠️ Port 5000 Special Case
Issue: Port 5000 has limited mirrored networking support due to Windows service binding.
Root Cause:
Windows
svchostservice binds to127.0.0.1:5000(localhost only)Localhost-only bindings are not fully mirrored between Windows and WSL2
This creates an exception to the general mirrored networking functionality
Port 5000 Communication Matrix:
✅ Windows ↔ Windows: Works (same localhost)
❌ WSL2 ↔ Windows: Fails (different localhost interpretation)
✅ WSL2 ↔ WSL2: Works (same environment)
Solutions for Port 5000:
Use different ports: 5001, 5002, etc. (recommended)
Stop Windows service: If not needed
Traditional port forwarding: For specific use cases
Common Services That May Have Localhost-Only Binding
Flask development servers (default
127.0.0.1:5000)UPnP Device Host service
Windows Media Player Network Sharing
Various development tools
Known Limitations of Mirrored Networking
Localhost-only services: Not fully mirrored (as confirmed with port 5000)
mDNS doesn't work in mirrored mode
Some Docker configurations may have issues
Requires Windows 11 22H2+ (build 22621+)