Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Viktigt!
MCP-servern (SQL Model Context Protocol) är tillgänglig i Data API Builder version 1.7. För de senaste funktionerna och felkorrigeringarna använder du förhandsversionen av 2.0.
SQL Model Context Protocol (MCP) Server fungerar med alla MCP-kompatibla klienter, inte bara molnbaserade AI-tjänster. Om din miljö begränsar åtkomsten till stor språkmodell (LLM) i molnet – vanlig inom sjukvårds-, försvars-, finans-, energi- och sjöfartsindustrin – kan du ansluta en lokal modell som hanteras via Ollama eller liknande verktyg. Den här guiden beskriver konfiguration, konfiguration av fältmetadata och promptmönster som gör små lokala modeller tillförlitliga.
Förutsättningar
- Data API Builder CLI installerad och konfigurerad med minst en entitet. Installera CLI.
-
Ollama med en modell som stöder verktygsanrop (till exempel
qwen3:8b,llama3.1:8b). -
Python 3.10+ med paketen
mcpochollama. - En SQL Server instans som körs med data.
Steg 1: Konfigurera fältmetadata
Fältmetadata är det viktigaste konfigurationssteget för lokal modellprecision. Utan fältnamn och beskrivningar ser agenter endast entitetsnamn och gissa kolumnnamn felaktigt.
Varning
Om du hoppar över det här steget skapas en MCP-server som tekniskt sett fungerar men som är funktionellt oanvändbar av alla modeller som läser verktygssvar. Modellen har ingen information om dina kolumner.
Lägg till entiteten med en beskrivning och lägg sedan till fältbeskrivningar som innehåller giltiga värden för begränsade kolumner:
dab add ServerInventory \
--source dbo.ServerInventory \
--permissions "anonymous:read" \
--description "SQL Server instance inventory with version, environment, and sizing data"
dab update ServerInventory \
--fields.name InstanceName --fields.primary-key true \
--fields.description "SQL Server instance name (e.g., YOURSERVER01)"
dab update ServerInventory \
--fields.name Environment \
--fields.description "Deployment environment. Valid values: Prod, Dev, Test, UAT"
Fullständig CLI-referens och metodtips – inklusive begränsade värden, parameterbeskrivningar och skriptmönster – finns i Lägga till beskrivningar i entiteter.
Note
dab update CLI behandlar kommatecken som argumentavgränsare. Om din beskrivning innehåller kommatecken kan du redigera dab-config.json direkt i stället.
Steg 2: Starta SQL MCP Server
dab start
SQL MCP Server lyssnar på http://localhost:5000/mcp och använder strömmande HTTP-transport som standard. Alla klienter som implementerar MCP-protokollet kan ansluta till den här slutpunkten.
Steg 3: Anslut din lokala modell
Skapa en MCP-klient som ansluter din Ollama-modell till SQL MCP Server. I följande Python exempel används MCP Python SDK och paketet ollama.
Installera beroenden
pip install mcp ollama
Minimal Python sele
import asyncio
import json
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
import ollama
MCP_URL = "http://localhost:5000/mcp"
MODEL = "qwen3:8b"
async def get_schema(session: ClientSession) -> str:
"""Call describe_entities and format results for the system prompt."""
result = await session.call_tool("describe_entities", arguments={})
entities = json.loads(result.content[0].text)
lines = []
for entity in entities.get("entities", []):
fields = ", ".join(
f"{f['name']} ({f.get('description', 'no description')})"
for f in entity.get("fields", [])
)
lines.append(f"- {entity['name']}: {entity.get('description', '')}")
if fields:
lines.append(f" Fields: {fields}")
return "\n".join(lines)
async def run(user_question: str):
async with streamable_http_client(MCP_URL) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
# Preinject schema into the system prompt
schema_text = await get_schema(session)
system_prompt = f"""You query a SQL database through MCP tools.
Available entities:
{schema_text}
Rules:
- Use the exact field names shown above.
- Answer count questions with the count only.
- Do not produce summaries unless asked.
- Do not invent example data. Only return data from tool responses.
- If no results, say "No results found" and stop.
"""
# Get available tools for Ollama
tools_result = await session.list_tools()
ollama_tools = [
{
"type": "function",
"function": {
"name": t.name,
"description": t.description or "",
"parameters": t.inputSchema,
},
}
for t in tools_result.tools
]
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_question},
]
# Chat loop: let the model call tools until it produces a final answer
while True:
response = ollama.chat(
model=MODEL, messages=messages, tools=ollama_tools
)
msg = response["message"]
messages.append(msg)
if not msg.get("tool_calls"):
print(msg["content"])
break
for tc in msg["tool_calls"]:
result = await session.call_tool(
tc["function"]["name"],
arguments=tc["function"]["arguments"],
)
messages.append(
{
"role": "tool",
"content": result.content[0].text,
}
)
asyncio.run(run("How many SQL 2019 servers are in production?"))
Det här ramverket hanterar hela cykeln: förinjektion av schema, upptäckt av verktyg, verktygsanrop över flera turer och extrahering av slutligt svar. Justera MODEL och MCP_URL för din miljö.
Förinjektionsschema vid uppstart
Små lokala modeller (under 14B-parametrar) ger mer tillförlitliga verktygsanrop när schemametadata finns i systemprompten innan konversationen börjar. I stället för att förlita sig på att modellen ska anropa describe_entities på egen hand under konversationen anropar du den vid start av sele och matar in resultatet.
Varför förinsprutning är viktigt
| Metod | Beteende med små modeller |
|---|---|
| Dynamisk upptäckning | Modellen måste bestämma sig för att anropa describe_entities först, sedan tolka resultaten och sedan anropa rätt verktyg med rätt fältnamn. Flera felpunkter. |
| Förinjektion | Modellen ser entitetsnamn, fältnamn och beskrivningar omedelbart. Rätt verktyg anropar vid det första försöket. |
Exemplet på sele i föregående avsnitt visar det här mönstret. Funktionen get_schema() anropar describe_entities en gång vid start och formaterar resultatet i systemprompten.
Tip
Större molnmodeller (GPT-4o, Claude) identifierar vanligtvis schemat under konversationen utan förinjektion. Det här mönstret är mest värdefullt för modeller under 14B-parametrar.
Begränsa modellsvar
En modell kan göra ett korrekt verktygsanrop, hämta rätt data och ändå skapa ett fel svar. Till exempel kan en modell som får frågan ”hur många produktionsservrar?” hämta 16 rader korrekt och sedan svara med en ledningssammanfattning på 40 rader som innehåller hallucinerade exempel i stället för talet 16.
Lägg till explicita negativa regler i systemprompten:
Rules:
- Answer count questions with the count only.
- Do not produce summaries unless the user asks for one.
- Do not invent example data. Only return data from tool responses.
- If a tool returns no results, say "No results found" and stop.
Verktygsanrop och svarsdisciplin är två olika problem. DAB säkerställer korrekt datahämtning via verktygslagret. Din snabb sele styr hur modellen visar resultat.
Considerations
| Topic | Detaljer |
|---|---|
| Hårdvara | Verktygsanrop fungerar på enkel maskinvara. En modell med 8 miljarder parametrar på ett Nvidia-grafikkort för konsumenter (8 GB videominne) ger användbara resultat. Förvänta dig svarstid i tiotals sekunder per fråga, vilket passar batcharbetsbelastningar. |
| Batch jämfört med interaktiv | Små modeller passar bra för batchbearbetning (prestandarapporter, inventeringsfrågor) där svarstidstoleransen är högre. |
| Verktygstillgänglighet |
aggregate_records är endast tillgängligt i förhandsversionen 2.0 och senare versioner. På version 1.7.x tvingar count- och aggregeringsfrågor modellen att läsa alla matchande rader. Se verktygstillgänglighet efter version. |
| Transport | Lokala modeller ansluter via HTTP med stöd för strömning till /mcp.
Standardinmatnings-/utdatatransporten (stdio) är ett alternativ för konfigurationer med en enda process. |
| autentisering | För lokal utveckling använder du anonymous behörigheter. För produktion konfigurerar du autentisering som är lämplig för din miljö. |