Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/hesabixAPI/adapters/api/v1/ai/mcp.py

44 lines
1.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from __future__ import annotations
from typing import Any, Dict, Optional
from fastapi import APIRouter, Body, Depends, Query, Request
from sqlalchemy.orm import Session
from adapters.db.session import get_db
from app.core.auth_dependency import AuthContext, get_current_user
from app.core.responses import ApiError, success_response
from app.services.ai.ai_mcp_service import handle_mcp_request
router = APIRouter(prefix="/ai/mcp", tags=["هوش مصنوعی-MCP"])
@router.post("", summary="پروتکل MCP (JSON-RPC 2.0)")
async def mcp_jsonrpc_endpoint(
request: Request,
body: Dict[str, Any] = Body(...),
business_id: Optional[int] = Query(None, description="شناسه کسب‌وکار برای tools"),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
) -> Dict[str, Any]:
"""
Endpoint سازگار با MCP برای لیست و فراخوانی ابزارهای Hesabix.
احراز هویت مانند سایر APIها (Bearer / Api-Key).
ابزارهای نوشتنی به‌صورت پیش‌فرض ``APPROVAL_REQUIRED`` برمی‌گردند.
برای اجرای write پس از تأیید، در بدنهٔ JSON-RPC مقدار
``params.approve_writes: true`` بفرستید — نه در query string.
"""
effective_business_id = business_id or ctx.business_id
if body.get("method") == "tools/call" and not effective_business_id:
raise ApiError("BUSINESS_ID_REQUIRED", "شناسه کسب و کار الزامی است", http_status=400)
if effective_business_id and not ctx.can_access_business(int(effective_business_id)):
raise ApiError("FORBIDDEN", "دسترسی به این کسب‌وکار مجاز نیست", http_status=403)
response = await handle_mcp_request(
db,
ctx,
body,
business_id=effective_business_id,
)
return response