qmcp Server
Um servidor MCP para integrar e consultar bancos de dados q/kdb+.
Documentação
Servidor qmcp
Um servidor Model Context Protocol (MCP) para integração com q/kdb+.
MCP é um protocolo aberto criado pela Anthropic que permite que sistemas de IA interajam com ferramentas externas e fontes de dados. Embora atualmente suportado pelo Claude (Desktop e CLI), o padrão aberto permite que outros LLMs o adotem no futuro.
Prova de Conceito de Código Aberto
Este repositório contém uma prova de conceito de código aberto demonstrando a abordagem central do qmcp. A ferramenta de tradução Qython (disponível em github.com/gabiteodoru/qython) cobre aproximadamente 5% da linguagem q e é fornecida para avaliação e experimentação.
Resultados de Produção: A implementação completa do Qython alcança uma taxa de falha de 0,6% nos benchmarks HumanEval, com melhoria de 10x na confiabilidade em relação ao desenvolvimento nativo em q. Veja a avaliação completa: Taxa de Falha de 0,6%: Resolvendo Geração de Código LLM para q/kdb+
Licenciamento Comercial: Para acesso à implementação completa do Qython com cobertura abrangente da linguagem, entre em contato pelo e-mail gabiteodoru@gmail.com
Recursos
- Conectar a servidores q/kdb+
- Executar consultas e comandos q
- Gerenciamento de conexão persistente
- Tratamento inteligente de consultas assíncronas com timeouts configuráveis
- Cancelamento programático de consultas (equivalente a Ctrl+C)
- Tratamento adequado de consultas de longa duração
- NOVO: Tradutor de linguagem Qython (Alpha Experimental)
Usuários Windows: Recomendação WSL
⚠️ Importante para usuários Windows: Para funcionalidade ideal, é altamente recomendado executar tanto o servidor MCP quanto sua sessão q dentro do WSL (Subsistema Windows para Linux). Isso garante que o servidor possa interromper loops infinitos e consultas descontroladas que LLMs possam gerar acidentalmente.
Executar o servidor MCP no Windows (fora do WSL) desativa a funcionalidade de interrupção de consultas baseada em SIGINT, que é crítica para escapar de consultas problemáticas durante sessões de desenvolvimento assistidas por IA.
Arquitetura e Filosofia de Design
Objetivos Pretendidos
O qmcp é projetado para fornecer a assistentes de codificação de IA acesso controlado a bancos de dados q/kdb+ para fluxos de trabalho de desenvolvimento e depuração:
- Focado em Desenvolvimento: Otimizado para ferramentas de codificação que trabalham com servidores q de depuração/desenvolvimento
- Controle de Consultas: A IA pode interromper consultas de longa duração (equivalente ao Ctrl+C do desenvolvedor)
- Comportamento Previsível: Execução sequencial previne conflitos de recursos durante o desenvolvimento
- Timeouts Configuráveis: Temporização personalizável para diferentes cenários de desenvolvimento
Lógica de Design
A arquitetura do servidor faz escolhas deliberadas para fluxos de trabalho de desenvolvimento assistidos por IA:
Modelo de Conexão Única
- Por quê: Simplifica a depuração de desenvolvimento - uma conexão, estado claro
- Benefício: Corresponde ao fluxo de trabalho típico do desenvolvedor com sessão q única
- Implementação: Uma conexão persistente por sessão MCP
Execução Sequencial de Consultas
- Por quê: Ambientes de desenvolvimento não precisam de suporte a consultas concorrentes
- Benefício: Uso previsível de recursos, depuração mais fácil, previne interferência entre consultas
- Implementação: Novas consultas são rejeitadas enquanto outra está em execução
Alternância Inteligente Assíncrona com Timeouts Configuráveis
Fast Query (< async switch timeout) → Return result immediately
Slow Query (> async switch timeout) → Switch to async mode
→ Auto-interrupt after interrupt timeout (if configured)
- Por quê: Mantém sessões de codificação de IA responsivas enquanto permite consultas de desenvolvimento complexas
- Benefício: Feedback imediato para consultas rápidas, acompanhamento de progresso para análises
- Personalização: Todos os timeouts configuráveis via ferramentas MCP
Interrupção de Consultas Controlada por IA
- Por quê: Ferramentas de codificação de IA precisam da capacidade de cancelar consultas descontroladas (como o Ctrl+C do desenvolvedor)
- Como: O servidor MCP localiza o processo q pela porta e envia SIGINT após timeout configurável
- Benefício: Previne que sessões de desenvolvimento travem em consultas problemáticas
- Limitações: Funcionalidade SIGINT desativada quando:
- O servidor MCP roda no Windows (fora do WSL)
- O servidor MCP e a sessão q rodam em lados opostos da divisão WSL/Windows
Gerenciamento de Processos Orientado ao Desenvolvimento
- Por quê: Ferramentas de codificação trabalham com servidores q de desenvolvimento gerenciados pelo usuário
- Benefício: O desenvolvedor controla o ciclo de vida do servidor q, a IA controla a execução de consultas
- Design: O servidor MCP fornece capacidade de interrupção de consultas sem gerenciamento do ciclo de vida do servidor
Por Que Este Design Faz Sentido para Ferramentas de Codificação
- Fluxo de Trabalho de Desenvolvimento: Corresponde a como desenvolvedores interagem com q - sessão única, consultas iterativas
- Segurança da IA: Previne que a IA sobrecarregue ambientes de desenvolvimento com solicitações concorrentes
- Adequado para Depuração: Execução sequencial facilita o rastreamento de problemas
- Responsivo: Tratamento assíncrono previne bloqueio de sessões de codificação de IA
- Configurável: Timeouts podem ser ajustados para diferentes cenários de desenvolvimento
Esta arquitetura fornece a assistentes de codificação de IA acesso eficaz ao q/kdb+ enquanto mantém o ambiente previsível e controlado que os fluxos de trabalho de desenvolvimento exigem.
Requisitos
- Python 3.8+
- Acesso a um servidor q/kdb+
uv(para instalação leve) oupip(para instalação completa)
Início Rápido
Para usuários de primeira viagem, a maneira mais rápida de começar:
- Inicie um servidor q:
q -p 5001 - Adicione qmcp ao Claude CLI:
claude mcp add qmcp "uv run qmcp/server.py" - Comece a usar o Claude CLI:
Em seguida, interaja com qmcp:claude> connect to port 5001 and compute 2+2 ● qmcp:connect_to_q (MCP)(host: "5001") ⎿ true ● qmcp:query_q (MCP)(command: "2+2") ⎿ 4
Instalação
Instalação Leve (somente Claude CLI)
Execute diretamente com uv (sem necessidade de instalação via pip, pode ser mais lento na inicialização; melhor para experimentar inicialmente):
claude mcp add qmcp "uv run qmcp/server.py"
Instalação Completa
Opção 1: pip (recomendado para uso global)
pip install qmcp
Nota: Considere usar um ambiente virtual para evitar conflitos de dependências:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install qmcp
Opção 2: uv (para uso específico de projeto)
# One-time execution (downloads dependencies each time)
uv run qmcp
# Or for frequent use, sync dependencies first
uv sync
uv run qmcp
Adicionando ao Claude CLI
Após a instalação completa, adicione o servidor ao Claude CLI:
claude mcp add qmcp qmcp
Adicionando ao Claude Desktop
Adicione ao seu arquivo de configuração do Claude Desktop:
{
"mcpServers": {
"qmcp": {
"command": "qmcp"
}
}
}
Para instalação baseada em uv:
{
"mcpServers": {
"qmcp": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/qmcp",
"run",
"qmcp"
]
}
}
}
Uso
Iniciando o Servidor MCP
Após instalação completa:
qmcp
Com instalação leve: O servidor inicia automaticamente quando o Claude CLI o utiliza (sem necessidade de início manual).
Variáveis de Ambiente
Q_DEFAULT_HOST- Informações de conexão padrão no formato:host,host:port, ouhost:port:user:passwd
Lógica de Fallback de Conexão
A ferramenta connect_to_q(host) usa lógica de fallback flexível:
- String de conexão completa (tem dois-pontos): Use diretamente, ignore
Q_DEFAULT_HOSTconnect_to_q("myhost:5001:user:pass")
- Somente número de porta: Combine com
Q_DEFAULT_HOSTou uselocalhostconnect_to_q(5001)→ Usa configurações deQ_DEFAULT_HOSTcom porta 5001
- Sem parâmetros: Use
Q_DEFAULT_HOSTdiretamenteconnect_to_q()→ UsaQ_DEFAULT_HOSTcomo está
- Somente nome de host: Use como nome de host com porta/autenticação
Q_DEFAULT_HOSTou porta padrãoconnect_to_q("myhost")→ Combina com configurações deQ_DEFAULT_HOST
Status de Estabilidade das Ferramentas
Ferramentas Prontas para Produção:
connect_to_q- Gerenciamento estável de conexão com lógica de fallbackquery_q- Executa consultas com controle inteligente de timeout assíncronoset_timeout_switch_to_async- Configura quando consultas alternam para modo assíncronoset_timeout_interrupt_q- Configura quando enviar SIGINT para cancelar consultasset_timeout_connection- Configura timeout de conexãoget_timeout_settings- Visualiza configuração atual de timeoutget_current_task_status- Verifica status de consulta assíncrona em execuçãoget_current_task_result- Recupera resultado de consulta assíncrona concluídainterrupt_current_query- Envia SIGINT para interromper consultas em execução
Ferramentas Experimentais (Alpha):
translate_qython_to_q- ⚠️ EXPERIMENTAL: Tradutor de sintaxe semelhante a Python para q- Qython suporta:
do n times:,converge(),partial(),reduce(),arange() - Assume importações:
from functools import partial,from numpy import arange - Incentiva operações vetorizadas, estilo numpy em vez de loops Python básicos
- Vocabulário limitado, pode produzir código incorreto
- Por favor, verifique toda a saída antes do uso
- Qython suporta:
translate_q_to_qython- ⚠️ EXPERIMENTAL: Tradutor de código Q para Python-like com desambiguação por IA- Usa ParseQ para converter expressões q em código legível e bem documentado semelhante a Python
- Analisa AST de q, achata chamadas aninhadas e usa IA para desambiguar operadores sobrecarregados
- Requer conexão q primeiro - execute a ferramenta
connect_to_qantes de usar (usa o próprio parser do q) - Impacto no Namespace: Cria variáveis e funções no namespace
.parseqda sua sessão q - Fixado ao Claude Code CLI - diferente de outras ferramentas que funcionam com qualquer LLM compatível com MCP, esta ferramenta especificamente chama o Claude Code CLI para desambiguação por IA
- Pode produzir traduções incorretas, especialmente para expressões complexas
- Por favor, verifique toda a saída antes do uso
- Reporte bugs em GitHub Issues
Limitações Conhecidas
Ao usar o servidor MCP, esteja ciente destas limitações:
Limitações de Interrupção de Consultas (SIGINT)
- Plataforma Windows: Interrupção de consultas desativada quando o servidor MCP roda no Windows (fora do WSL)
- Configuração Multiplataforma: Interrupção de consultas desativada quando o servidor MCP e a sessão q rodam em lados opostos da divisão WSL/Windows
- Impacto: O LLM não pode escapar automaticamente de loops infinitos ou cancelar consultas descontroladas nessas configurações
Limitações de Conversão de Dados
- Tabelas com chave: Operações como
1!tablepodem falhar durante a conversão para pandas - Distinção String vs Symbol: Strings e símbolos q podem parecer idênticos na saída
- Ambiguidade de tipos: Use os comandos
metaetypedo q para determinar os tipos de dados reais quando a precisão for importante - Conversão pandas: Algumas estruturas de dados específicas do q podem não ser convertidas adequadamente para DataFrames pandas
Para verificação de tipos, use:
meta table / Check table column types and structure
type variable / Check variable type
Comunicação de Porta WSL2 (Usuários Windows)
Pule esta seção se você não estiver no Windows.
Como o Claude CLI é exclusivo do WSL no Windows, mas você pode querer usar IDEs ou ferramentas do Windows para conectar ao seu servidor q, você precisa de comunicação de porta adequada entre WSL2 e Windows.
Configuração WSL2 para Comunicação de Porta
Configuração do Arquivo .wslconfig
Localização: C:\Users\{YourUsername}\.wslconfig
Adicione configuração de rede espelhada:
# Mirrored networking mode for seamless port communication
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
Reinicie o WSL2
Execute a partir do Windows PowerShell/CMD (NÃO de dentro do WSL):
wsl --shutdown
# Wait a few seconds, then start WSL again
Verifique a Configuração
Verifique se a rede espelhada está ativa:
ip addr show
cat /etc/resolv.conf
Teste a Comunicação de Porta
Teste WSL2 → Windows (localhost):
# In WSL2, start a server
python3 -m http.server 8000
# In Windows browser or PowerShell
curl http://localhost:8000
Teste Windows → WSL2 (localhost):
# In Windows PowerShell
python -m http.server 8001
# In WSL2
curl http://localhost:8001
O Que a Rede Espelhada Fornece
- ✅ Comunicação direta com localhost em ambas as direções
- ✅ Sem necessidade de encaminhamento manual de portas
- ✅ Melhor compatibilidade com VPN
- ✅ Rede simplificada (Windows e WSL2 compartilham interfaces de rede)
- ✅ Regras de firewall tratadas automaticamente
⚠️ Caso Especial da Porta 5000
Problema: A porta 5000 tem suporte limitado de rede espelhada devido à vinculação de serviços do Windows.
Causa Raiz:
- O serviço
svchostdo Windows vincula-se a127.0.0.1:5000(somente localhost) - Vinculações somente localhost não são totalmente espelhadas entre Windows e WSL2
- Isso cria uma exceção à funcionalidade geral de rede espelhada
Matriz de Comunicação da Porta 5000:
- ✅ Windows ↔ Windows: Funciona (mesmo localhost)
- ❌ WSL2 ↔ Windows: Falha (interpretação diferente de localhost)
- ✅ WSL2 ↔ WSL2: Funciona (mesmo ambiente)
Soluções para a Porta 5000:
- Use portas diferentes: 5001, 5002, etc. (recomendado)
- Pare o serviço do Windows: Se não for necessário
- Encaminhamento tradicional de portas: Para casos de uso específicos
Serviços Comuns Que Podem Ter Vinculação Somente Localhost
- Servidores de desenvolvimento Flask (padrão
127.0.0.1:5000) - Serviço de Host de Dispositivos UPnP
- Compartilhamento de Rede do Windows Media Player
- Várias ferramentas de desenvolvimento
Limitações Conhecidas da Rede Espelhada
- Serviços somente localhost: Não totalmente espelhados (como confirmado com a porta 5000)
- mDNS não funciona no modo espelhado
- Algumas configurações do Docker podem ter problemas
- Requer Windows 11 22H2+ (build 22621+)