OpenBudget

Provides access to Israel's OpenBudget API for querying and searching government financial data including budgets, contracts, and support payments

OpenBudgetapi-integrationPython
0Tools
11Findings
12Stars
Mar 22, 2026Last Scanned
2 critical · 7 high · 1 medium · 1 low findings detected

Security Category Deep Dive

Prompt Injection
Prompt & context manipulation attacks
69
Maturity
14
Rules
5
Sub-Categories
1
Gaps
64%
Implemented
56
Tests
1
Stories
PI-DIRDirect Input Injection
100%3 rules
Injection via tool descriptions and parameter fields
GAP-001Prompt Injection Coverage GapMissing detection coverage for emerging prompt injection attack variants not addressed by current rules
PI-INDIndirect / Gateway Injection
100%4 rules
Hidden instructions via external content and tool responses
PI-CTXContext Manipulation
100%2 rules
Context window saturation and prior-approval exploitation
PI-ENCEncoding & Obfuscation
100%3 rules
Payload hiding via invisible chars, base64, schema fields
PI-TPLTemplate & Output Poisoning
100%2 rules
Injection via prompt templates and runtime tool output
Framework Coverage
OWASP MCP Top 1014/14
MITRE ATLAS14/14
CoSAI MCP2/14
OWASP Agentic Top 1012/14
Kill Chain Phases
0Initial Access
0Defense Evasion
0Execution
0Persistence

Findings11

2critical
7high
1medium
1low

Critical2

criticalQ13MCP Bridge Package Supply Chain AttackMCP10-supply-chainAML.T0054
Pattern "(?:mcp|fastmcp|langchain-mcp|llama-index-mcp)(?:>=|~=|==)?(?!\d)" matched in source_code: "fastmcp" (at position 75)
MCP bridge packages (mcp-remote, mcp-proxy, @modelcontextprotocol/sdk, fastmcp) are high-value supply chain targets — CVE-2025-6514 (CVSS 9.6) in mcp-remote affected 437,000+ installs. Always pin exact versions (no ^ or ~ ranges). Use lockfiles (package-lock.json, pnpm-lock.yaml, uv.lock). Never run `npx mcp-remote` without version pinning. Verify package integrity with `npm audit` or `pip-audit` before deployment. Reference: CVE-2025-6514, OWASP ASI04.
criticalC1Command InjectionMCP03-command-injectionAML.T0054
Pattern "`[^`]+`" matched in source_code: "`item_url`" (at position 9133)
Replace exec()/execSync() with execFile() and pass arguments as an array, never as a string. Validate all inputs against an allowlist before use in any shell context. For subprocess.run, always pass a list and shell=False.

High7

highD1Known CVEs in DependenciesMCP08-dependency-vuln
Dependency "fastmcp@0.3.0" has known CVEs:
Update dependencies to versions that patch known CVEs. Run 'npm audit fix' or 'pip-audit' to identify and resolve vulnerable dependencies.
highD1Known CVEs in DependenciesMCP08-dependency-vuln
Dependency "requests@2.31.0" has known CVEs:
Update dependencies to versions that patch known CVEs. Run 'npm audit fix' or 'pip-audit' to identify and resolve vulnerable dependencies.
highK13Unsanitized Tool OutputMCP02-tool-poisoningAML.T0054
Pattern "(?:fetch|axios|requests?\.get|http\.get).*(?:return|respond|result|body|text|data)(?!.*(?:sanitize|escape|encode|strip|validate|parse|extract))" matched in source_code: "Fetching data" (at position 5409)
Sanitize all external data before including in tool responses. Implement output encoding that neutralizes prompt injection patterns. Truncate excessively long content. Validate structure before passing database results. Apply the principle: treat all external data as untrusted, even in tool outputs. Required by CoSAI MCP-T4.
highD1Known CVEs in DependenciesMCP08-dependency-vuln
Dependency "starlette@0.35.0" has known CVEs:
Update dependencies to versions that patch known CVEs. Run 'npm audit fix' or 'pip-audit' to identify and resolve vulnerable dependencies.
highC3Server-Side Request Forgery (SSRF)MCP04-data-exfiltrationAML.T0057
Pattern "\brequests\.(?:get|post|put|delete|patch|head|options|request)\s*\(\s*(?:req|request|input|param|params|args|url|uri|href|link|target|destination|endpoint|host|address|resource|src|source)" matched in source_code: "requests.get(url" (at position 5459)
Validate ALL user-supplied URLs before making HTTP requests: 1. Parse the URL and check the hostname against an explicit allowlist of permitted domains. 2. Block requests to RFC 1918 private ranges: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16. 3. Block loopback (127.0.0.0/8), link-local (169.254.0.0/16), and IPv6 equivalents. 4. Block file:// and other non-http(s) protocols explicitly. 5. Disable automatic redirect following, or re-validate each redirect destination. 6. In cloud environments: block requests to IMDS endpoints (169.254.169.254, metadata.google.internal) at both the application AND network layer. Example (Node.js): Use the `ssrf-req-filter` package or implement URL validation against an allowlist before calling fetch/axios/got.
highK18Cross-Trust-Boundary Data Flow in Tool ResponseMCP04-data-exfiltrationAML.T0054
Pattern "(?:readFile|read_file|query|select|getSecret|getCredential|getPassword).*(?:webhook|http|fetch|axios|post|send|email|slack|discord)" matched in source_code: "query: Post" (at position 10904)
Implement data flow taint tracking: tag data from sensitive sources (databases, credentials, files) and prevent it from flowing to external sinks (HTTP, webhooks, email) without explicit sanitization/redaction. Apply data classification and enforce boundary controls per trust level. Required by ISO 27001 A.5.14 and CoSAI MCP-T5.
highO8Timing-Based Covert ChannelMCP04-data-exfiltrationAML.T0057
Pattern "(?:delay|sleep|timeout|interval)\s*[:=]\s*(?:[^;]*(?:secret|token|password|credential|key|env))" matched in source_code: "timeout=30) response.raise_for_status() return response.json() except Exception as e: log.error(f"Error fetching dataset info for {dataset}: {e}") return {"error": str(e)} @mcp.tool(annotations=ANNOTATIONS) def DatasetFullTextSearch(dataset: str, q: str) -> dict: """ Perform full-text search on a dataset to locate relevant items and identifiers. **Purpose**: Use this tool to find specific textual identifiers (IDs, codes, names) needed for precise queries. Do NOT use this tool for searching time periods or dates. **Usage Instructions**: 1. ALWAYS call DatasetInfo first to understand the dataset structure 2. Use free-text search to find entities by name, title, or description 3. Extract relevant identifiers (like entity_id, code, budget_code) from the results 4. Use these identifiers in your DatasetDBQuery calls for precise filtering 5. NEVER present search results directly to the user as your final answer **When to use**: - To find the entity_id of an organization mentioned by name - To find budget item codes by searching for keywords - To locate contracts by supplier name or description - When you need specific identifiers but only have descriptive text **Important**: - Search results are for YOUR use to find identifiers, not for presenting to users - Always follow up with DatasetDBQuery using the identifiers you found - If unsure which identifier to use in a query, search first - AVOID calling more than 4 tools in parallel to prevent memory overflow Args: dataset: ID of the dataset to search. Available datasets: - budget_items_data: Budget book (ספר התקציב) - support_programs_data: Support programs (תוכניות תמיכה) - supports_transactions_data: Support payments (תשלומי תמיכות) - contracts_data: Procurement contracts (התקשרויות רכש) - entities_data: Organizations and entities (גופים וארגונים) - income_items_data: State revenues (הכנסות המדינה) - budgetary_change_requests_data: Budget change requests (בקשות שינוי תקציב) - budgetary_change_transactions_data: Budget change transactions (שינויי תקציב) q: Free-text search query (organization name, keyword, description, etc.) Returns: Search results with matching items and their identifiers """ try: url = f"{BUDGETKEY_API_BASE}/api/tables/{dataset}/search" params = {"q": q} log.info(f"Searching dataset {dataset}: {url}?q={q}") response = requests.get(url, params=params, timeout=30) response.raise_for_status() return response.json() except Exception as e: log.error(f"Error searching dataset {dataset} with query '{q}': {e}") return {"error": str(e)} @mcp.tool(annotations=ANNOTATIONS) def DatasetDBQuery(dataset: str, query: str, page_size: int = 50) -> dict: """ Execute PostgreSQL-compatible SQL queries to obtain comprehensive, precise information from datasets. **CRITICAL Prerequisites**: 1. MUST call DatasetInfo first to understand the dataset schema 2. Use exact column names from the schema (case-sensitive) 3. If you need identifiers, call DatasetFullTextSearch first to find them **Usage Instructions**: - Use only identifiers found through DatasetFullTextSearch - NEVER guess identifiers - Filter by relevant time periods (year, date fields) - Use aggregate functions (SUM, COUNT, AVG) to summarize data when appropriate - ALWAYS include the `item_url` field in SELECT to provide direct links to data - Construct queries based on the exact schema from DatasetInfo **Query Best Practices**: - Format results in tables when possible - Use ORDER BY to sort results meaningfully - Apply WHERE clauses for time periods and specific filters - Use JOINs when querying related datasets - Include descriptive fields (title, name, description) along with values **Handling Results**: - Check for warnings in the response - if present, fix the query and re-run - Extract the `download_url` field from results - Offer users download links formatted as markdown: [Download data](download_url) - Use `item_url` to create clickable links: [Item Name](item_url) - Present data professionally in tables or structured format **Important**: - NEVER present results based on a query that returned warnings - Always verify your SQL syntax is PostgreSQL-compatible - Use aggregate functions for summary data - Filter by time periods appropriately Args: dataset: ID of the dataset to query. Available datasets: - budget_items_data: Budget book (ספר התקציב) - support_programs_data: Support programs (תוכניות תמיכה) - supports_transactions_data: Support payments (תשלומי תמיכות) - contracts_data: Procurement contracts (התקשרויות רכש) - entities_data: Organizations and entities (גופים וארגונים) - income_items_data: State revenues (הכנסות המדינה) - budgetary_change_requests_data: Budget change requests (בקשות שינוי תקציב) - budgetary_change_transactions_data: Budget change transactions (שינויי תקציב) query: PostgreSQL-compatible SQL query to execute. Example: "SELECT year, code, title, net_allocated, net_executed, item_url FROM budget_items_data WHERE year = 2025 AND title LIKE '%חינוך%' ORDER BY net_allocated DESC LIMIT 10" page_size: Number of rows to return (default: 50) Returns: Query results including: - rows: Array of result rows - download_url: Link to download full dataset (offer this to users as markdown link) - warnings: Any warnings about the query (must fix and re-run if present) """ try: url = f"{BUDGETKEY" (at position 5477)
Remove all code that calculates sleep/delay durations from application data, secrets, or any variable-length content. Tool response times should be constant or determined only by legitimate processing time. If rate limiting is needed, use fixed intervals not derived from data values. Monitor for anomalous response time patterns that could indicate timing-based exfiltration.

Medium1

mediumK17Missing Timeout or Circuit BreakerMCP07-insecure-configAML.T0054
Pattern "(?:query|execute|find|select|aggregate)\s*\((?!.*(?:timeout|maxTimeMS|statement_timeout|deadline|cancel))" matched in source_code: "query (" (at position 7808)
Add timeouts to ALL external calls: HTTP requests (30s), database queries (10s), subprocess execution (60s), and MCP tool calls (30s). Implement circuit breakers that open after N consecutive failures (e.g., opossum, cockatiel). Use AbortSignal for cancellable operations. Required by EU AI Act Art. 15 and OWASP ASI08.

Low1

lowF4MCP Spec Non-ComplianceMCP07-insecure-config
Server fails MCP spec compliance checks: required:server_name; required:server_version; required:protocol_version; recommended:tool_descriptions; recommended:parameter_descriptions
Follow the MCP specification for server metadata. Include server name, version, and protocol version. Provide descriptions for all tools and parameters.