Quotations MCP Server
Provides tools for querying and searching quotations stored in a MongoDB database via a REST API backend.
Click on "Deploy 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., "@Quotations MCP Serverhow many pending quotations do we have?"
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.
Quotations MCP Server
Standalone MCP server exposing the quotations-app backend as tools. It's a thin HTTP client over the quotations REST API — no database of its own — so it stays decoupled and can point at local dev or the live Render backend.
MCP agent ──MCP──► server.py ──HTTP──► quotations-app backend ──► MongoDBOther services in this repo
This is one of three independently-deployable pieces that happen to share a git repo — no shared state, no shared process:
Path | What it is |
| This MCP server — read-only, queries the quotations backend |
| Background worker: Gmail → classify/extract/match (pgvector catalog matching) → quotation → Oscar task. See |
| Temporary FastAPI + Streamlit UI for demoing the |
| The old on-demand "Oscar AI" DM bot + its price lists, relocated OUT of the Oscar backend on 2026-09-26. Currently not runnable as-is — see below. |
Related MCP server: finance-mcp
oscar_ai_bot_legacy/ — the "Oscar AI" DM bot (moved 2026-09-26)
What it was: a second, focused RFQ path inside the Oscar backend (AlumnxAILabs_epa), separate from
the automatic background poller (rfq_service/ above). A team member could DM a special "Oscar AI" account
inside the Oscar chat app and ask "any new RFQ emails?" — the bot would check the mailbox on demand and
reply in-chat with quotation details, instead of waiting for the background worker's own polling cycle.
Why it's here now: all RFQ-processing code was consolidated into this repo. This folder holds every file that on-demand path depended on:
File | Role |
| The focused LangChain agent — ONE tool ( |
| The |
| Pipeline: dedup → classify → extract → match → quote → create task |
| "Is this an RFQ?" (keyword prefilter + GPT-4o-mini) |
| Pulls products/customer/company out of the email |
| Matches extracted items against the price list (rapidfuzz + LLM pick) |
| Loads |
| Calls the Quotation App's |
| Single-account Gmail OAuth client (shared RFQ inbox) |
| One-time script: provisions the "Oscar AI" user account |
| Removes that account from all teams (it's server-side, not a real team member) |
| Mints the Gmail refresh token these services need |
| The actual company price lists |
⚠️ NOT currently runnable standalone. email_processing_service.py imports Oscar-core services
(item_service, comment_service, notification_service) that only exist inside the Oscar backend's own
Python path — those aren't in this repo. To bring the DM bot back to life here, one of two things has to
happen first:
Rewire it to call Oscar's
/internal/*API (the same patternrfq_service/oscar_client.pyin this repo already uses for the background worker) instead of importingitem_service/comment_servicedirectly — i.e. makeemail_processing_service.py's task-creation step an HTTP call, not a local import.Or run it co-located with a copy of the Oscar backend's
models/servicespackage on the Python path (not recommended — reintroduces the tight coupling this move was meant to remove).
Automatic assignment behavior (unchanged from when it lived in Oscar): every quotation this pipeline
creates is auto-assigned to the team lead of whichever team the asking user belongs to
(resolve_team_lead in email_processing_service.py) — not to the asker, and not to a fixed person. A task
carrying the quotation link is created and assigned the same way. If the asker has no team, it falls back to
RFQ_TEAM_LEAD_USER_ID, then the owner of RFQ_ORG_TEAM_ID.
Config this path needs (same names as rfq_service/'s own env vars — see that folder's .env.example):
GMAIL_* (OAuth creds for the shared inbox), OPENAI_API_KEY, QUOTATION_API_URL /
QUOTATION_FRONTEND_URL, RFQ_TEAM_LEAD_USER_ID, RFQ_ORG_TEAM_ID, RFQ_TASK_DUE_MINUTES /
RFQ_TASK_DUE_HOURS, OSCAR_AI_BOT_ID (the provisioned bot account's user id in Oscar's own database).
As of this move, the "Oscar AI" DM feature is OFF inside the live Oscar app — the code that triggered it
(main.py's DM-interception hook) has been removed there. Reviving it means finishing option 1 or 2 above,
then re-adding an equivalent trigger wherever DMs are handled going forward.
Tools
Purpose is conversational intelligence — let an agent answer natural-language questions about quotations (counts, values, who-has-what, lookups) and take actions.
Conversational / query (read):
Tool | Answers |
| "how many are pending?", "total pipeline value?", "who has the most?" — counts by status + value by assignee |
| "show quotations assigned to Vijender over ₹10k" — filtered list + total value |
| resolves a human number like |
| all quotations (compact) |
| one full quotation by internal id |
| backend reachability + count |
READ-ONLY by design. This MCP only queries the customer's data and answers questions — it never writes (no create/reassign). Creating or modifying quotations is the customer app's job. The backend exposes only list + get, so filtering/aggregation is done here; prices/totals come only from the server-computed data — never invented.
Completion / status
A quotation is "completed" only if the customer's data stores that state. Today
their backend hard-codes status:"draft" and never changes it, so quotation_stats
/ search_quotations(status=...) will only ever report draft. The moment their
app writes a real status (e.g. completed/sent), these read tools surface it
automatically — no change here.
Install
pip install -r requirements.txt # mcp[cli], httpxRun
# stdio (dev / desktop MCP clients)
python server.py
# HTTP endpoint (for the MCP agent to connect to)
MCP_TRANSPORT=http MCP_PORT=8200 python server.py
# → MCP endpoint at http://<host>:8200/mcp
# inspect/try tools
mcp dev server.pyEnv
Var | Default | Purpose |
|
| backend base URL |
|
| HTTP timeout (bump for Render cold start ~50s) |
|
|
|
|
| bind for http transport |
Notes
Deployed separately from the quotations backend and from Oscar.
The Oscar agent will later connect to this server (as an MCP client) via a new endpoint — this repo/folder does not depend on Oscar.
This server cannot be deployed
Maintenance
Related MCP Connectors
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
MCP server for querying Forkast documentation
OAuth-protected, read-only-by-default MCP server for provenance-labeled QuillCaddie project memory.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server exposing Accelo quote tools (list, get, create, update) with per-user OAuth authentication for natural language interaction.1MIT
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server for stock quotes, Coinbase prices, and Polymarket markets, supporting tools like get_stock_quote, get_coinbase_spot_price, and search_polymarket_markets.42 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables users to retrieve citation-grade quotes from public-domain authors through an MCP server.15 npmMIT
- AlicenseNot gradedqualityCmaintenanceRead-only MCP server for inspecting a neuro auto-posting service's publication pipeline. Allows operators to query channels, publications, errors, and configuration via natural language.MIT