ai-parrot 0.17.2__cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentui/.prettierrc +15 -0
- agentui/QUICKSTART.md +272 -0
- agentui/README.md +59 -0
- agentui/env.example +16 -0
- agentui/jsconfig.json +14 -0
- agentui/package-lock.json +4242 -0
- agentui/package.json +34 -0
- agentui/scripts/postinstall/apply-patches.mjs +260 -0
- agentui/src/app.css +61 -0
- agentui/src/app.d.ts +13 -0
- agentui/src/app.html +12 -0
- agentui/src/components/LoadingSpinner.svelte +64 -0
- agentui/src/components/ThemeSwitcher.svelte +159 -0
- agentui/src/components/index.js +4 -0
- agentui/src/lib/api/bots.ts +60 -0
- agentui/src/lib/api/chat.ts +22 -0
- agentui/src/lib/api/http.ts +25 -0
- agentui/src/lib/components/BotCard.svelte +33 -0
- agentui/src/lib/components/ChatBubble.svelte +63 -0
- agentui/src/lib/components/Toast.svelte +21 -0
- agentui/src/lib/config.ts +20 -0
- agentui/src/lib/stores/auth.svelte.ts +73 -0
- agentui/src/lib/stores/theme.svelte.js +64 -0
- agentui/src/lib/stores/toast.svelte.ts +31 -0
- agentui/src/lib/utils/conversation.ts +39 -0
- agentui/src/routes/+layout.svelte +20 -0
- agentui/src/routes/+page.svelte +232 -0
- agentui/src/routes/login/+page.svelte +200 -0
- agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
- agentui/src/routes/talk/[agentId]/+page.ts +7 -0
- agentui/static/README.md +1 -0
- agentui/svelte.config.js +11 -0
- agentui/tailwind.config.ts +53 -0
- agentui/tsconfig.json +3 -0
- agentui/vite.config.ts +10 -0
- ai_parrot-0.17.2.dist-info/METADATA +472 -0
- ai_parrot-0.17.2.dist-info/RECORD +535 -0
- ai_parrot-0.17.2.dist-info/WHEEL +6 -0
- ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
- ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
- ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
- crew-builder/.prettierrc +15 -0
- crew-builder/QUICKSTART.md +259 -0
- crew-builder/README.md +113 -0
- crew-builder/env.example +17 -0
- crew-builder/jsconfig.json +14 -0
- crew-builder/package-lock.json +4182 -0
- crew-builder/package.json +37 -0
- crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
- crew-builder/src/app.css +62 -0
- crew-builder/src/app.d.ts +13 -0
- crew-builder/src/app.html +12 -0
- crew-builder/src/components/LoadingSpinner.svelte +64 -0
- crew-builder/src/components/ThemeSwitcher.svelte +149 -0
- crew-builder/src/components/index.js +9 -0
- crew-builder/src/lib/api/bots.ts +60 -0
- crew-builder/src/lib/api/chat.ts +80 -0
- crew-builder/src/lib/api/client.ts +56 -0
- crew-builder/src/lib/api/crew/crew.ts +136 -0
- crew-builder/src/lib/api/index.ts +5 -0
- crew-builder/src/lib/api/o365/auth.ts +65 -0
- crew-builder/src/lib/auth/auth.ts +54 -0
- crew-builder/src/lib/components/AgentNode.svelte +43 -0
- crew-builder/src/lib/components/BotCard.svelte +33 -0
- crew-builder/src/lib/components/ChatBubble.svelte +67 -0
- crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
- crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
- crew-builder/src/lib/components/JsonViewer.svelte +24 -0
- crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
- crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
- crew-builder/src/lib/components/Toast.svelte +67 -0
- crew-builder/src/lib/components/Toolbar.svelte +157 -0
- crew-builder/src/lib/components/index.ts +10 -0
- crew-builder/src/lib/config.ts +8 -0
- crew-builder/src/lib/stores/auth.svelte.ts +228 -0
- crew-builder/src/lib/stores/crewStore.ts +369 -0
- crew-builder/src/lib/stores/theme.svelte.js +145 -0
- crew-builder/src/lib/stores/toast.svelte.ts +69 -0
- crew-builder/src/lib/utils/conversation.ts +39 -0
- crew-builder/src/lib/utils/markdown.ts +122 -0
- crew-builder/src/lib/utils/talkHistory.ts +47 -0
- crew-builder/src/routes/+layout.svelte +20 -0
- crew-builder/src/routes/+page.svelte +539 -0
- crew-builder/src/routes/agents/+page.svelte +247 -0
- crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
- crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
- crew-builder/src/routes/builder/+page.svelte +204 -0
- crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
- crew-builder/src/routes/crew/ask/+page.ts +1 -0
- crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
- crew-builder/src/routes/login/+page.svelte +197 -0
- crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
- crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
- crew-builder/static/README.md +1 -0
- crew-builder/svelte.config.js +11 -0
- crew-builder/tailwind.config.ts +53 -0
- crew-builder/tsconfig.json +3 -0
- crew-builder/vite.config.ts +10 -0
- mcp_servers/calculator_server.py +309 -0
- parrot/__init__.py +27 -0
- parrot/__pycache__/__init__.cpython-310.pyc +0 -0
- parrot/__pycache__/version.cpython-310.pyc +0 -0
- parrot/_version.py +34 -0
- parrot/a2a/__init__.py +48 -0
- parrot/a2a/client.py +658 -0
- parrot/a2a/discovery.py +89 -0
- parrot/a2a/mixin.py +257 -0
- parrot/a2a/models.py +376 -0
- parrot/a2a/server.py +770 -0
- parrot/agents/__init__.py +29 -0
- parrot/bots/__init__.py +12 -0
- parrot/bots/a2a_agent.py +19 -0
- parrot/bots/abstract.py +3139 -0
- parrot/bots/agent.py +1129 -0
- parrot/bots/basic.py +9 -0
- parrot/bots/chatbot.py +669 -0
- parrot/bots/data.py +1618 -0
- parrot/bots/database/__init__.py +5 -0
- parrot/bots/database/abstract.py +3071 -0
- parrot/bots/database/cache.py +286 -0
- parrot/bots/database/models.py +468 -0
- parrot/bots/database/prompts.py +154 -0
- parrot/bots/database/retries.py +98 -0
- parrot/bots/database/router.py +269 -0
- parrot/bots/database/sql.py +41 -0
- parrot/bots/db/__init__.py +6 -0
- parrot/bots/db/abstract.py +556 -0
- parrot/bots/db/bigquery.py +602 -0
- parrot/bots/db/cache.py +85 -0
- parrot/bots/db/documentdb.py +668 -0
- parrot/bots/db/elastic.py +1014 -0
- parrot/bots/db/influx.py +898 -0
- parrot/bots/db/mock.py +96 -0
- parrot/bots/db/multi.py +783 -0
- parrot/bots/db/prompts.py +185 -0
- parrot/bots/db/sql.py +1255 -0
- parrot/bots/db/tools.py +212 -0
- parrot/bots/document.py +680 -0
- parrot/bots/hrbot.py +15 -0
- parrot/bots/kb.py +170 -0
- parrot/bots/mcp.py +36 -0
- parrot/bots/orchestration/README.md +463 -0
- parrot/bots/orchestration/__init__.py +1 -0
- parrot/bots/orchestration/agent.py +155 -0
- parrot/bots/orchestration/crew.py +3330 -0
- parrot/bots/orchestration/fsm.py +1179 -0
- parrot/bots/orchestration/hr.py +434 -0
- parrot/bots/orchestration/storage/__init__.py +4 -0
- parrot/bots/orchestration/storage/memory.py +100 -0
- parrot/bots/orchestration/storage/mixin.py +119 -0
- parrot/bots/orchestration/verify.py +202 -0
- parrot/bots/product.py +204 -0
- parrot/bots/prompts/__init__.py +96 -0
- parrot/bots/prompts/agents.py +155 -0
- parrot/bots/prompts/data.py +216 -0
- parrot/bots/prompts/output_generation.py +8 -0
- parrot/bots/scraper/__init__.py +3 -0
- parrot/bots/scraper/models.py +122 -0
- parrot/bots/scraper/scraper.py +1173 -0
- parrot/bots/scraper/templates.py +115 -0
- parrot/bots/stores/__init__.py +5 -0
- parrot/bots/stores/local.py +172 -0
- parrot/bots/webdev.py +81 -0
- parrot/cli.py +17 -0
- parrot/clients/__init__.py +16 -0
- parrot/clients/base.py +1491 -0
- parrot/clients/claude.py +1191 -0
- parrot/clients/factory.py +129 -0
- parrot/clients/google.py +4567 -0
- parrot/clients/gpt.py +1975 -0
- parrot/clients/grok.py +432 -0
- parrot/clients/groq.py +986 -0
- parrot/clients/hf.py +582 -0
- parrot/clients/models.py +18 -0
- parrot/conf.py +395 -0
- parrot/embeddings/__init__.py +9 -0
- parrot/embeddings/base.py +157 -0
- parrot/embeddings/google.py +98 -0
- parrot/embeddings/huggingface.py +74 -0
- parrot/embeddings/openai.py +84 -0
- parrot/embeddings/processor.py +88 -0
- parrot/exceptions.c +13868 -0
- parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/exceptions.pxd +22 -0
- parrot/exceptions.pxi +15 -0
- parrot/exceptions.pyx +44 -0
- parrot/generators/__init__.py +29 -0
- parrot/generators/base.py +200 -0
- parrot/generators/html.py +293 -0
- parrot/generators/react.py +205 -0
- parrot/generators/streamlit.py +203 -0
- parrot/generators/template.py +105 -0
- parrot/handlers/__init__.py +4 -0
- parrot/handlers/agent.py +861 -0
- parrot/handlers/agents/__init__.py +1 -0
- parrot/handlers/agents/abstract.py +900 -0
- parrot/handlers/bots.py +338 -0
- parrot/handlers/chat.py +915 -0
- parrot/handlers/creation.sql +192 -0
- parrot/handlers/crew/ARCHITECTURE.md +362 -0
- parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
- parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
- parrot/handlers/crew/__init__.py +0 -0
- parrot/handlers/crew/handler.py +801 -0
- parrot/handlers/crew/models.py +229 -0
- parrot/handlers/crew/redis_persistence.py +523 -0
- parrot/handlers/jobs/__init__.py +10 -0
- parrot/handlers/jobs/job.py +384 -0
- parrot/handlers/jobs/mixin.py +627 -0
- parrot/handlers/jobs/models.py +115 -0
- parrot/handlers/jobs/worker.py +31 -0
- parrot/handlers/models.py +596 -0
- parrot/handlers/o365_auth.py +105 -0
- parrot/handlers/stream.py +337 -0
- parrot/interfaces/__init__.py +6 -0
- parrot/interfaces/aws.py +143 -0
- parrot/interfaces/credentials.py +113 -0
- parrot/interfaces/database.py +27 -0
- parrot/interfaces/google.py +1123 -0
- parrot/interfaces/hierarchy.py +1227 -0
- parrot/interfaces/http.py +651 -0
- parrot/interfaces/images/__init__.py +0 -0
- parrot/interfaces/images/plugins/__init__.py +24 -0
- parrot/interfaces/images/plugins/abstract.py +58 -0
- parrot/interfaces/images/plugins/analisys.py +148 -0
- parrot/interfaces/images/plugins/classify.py +150 -0
- parrot/interfaces/images/plugins/classifybase.py +182 -0
- parrot/interfaces/images/plugins/detect.py +150 -0
- parrot/interfaces/images/plugins/exif.py +1103 -0
- parrot/interfaces/images/plugins/hash.py +52 -0
- parrot/interfaces/images/plugins/vision.py +104 -0
- parrot/interfaces/images/plugins/yolo.py +66 -0
- parrot/interfaces/images/plugins/zerodetect.py +197 -0
- parrot/interfaces/o365.py +978 -0
- parrot/interfaces/onedrive.py +822 -0
- parrot/interfaces/sharepoint.py +1435 -0
- parrot/interfaces/soap.py +257 -0
- parrot/loaders/__init__.py +8 -0
- parrot/loaders/abstract.py +1131 -0
- parrot/loaders/audio.py +199 -0
- parrot/loaders/basepdf.py +53 -0
- parrot/loaders/basevideo.py +1568 -0
- parrot/loaders/csv.py +409 -0
- parrot/loaders/docx.py +116 -0
- parrot/loaders/epubloader.py +316 -0
- parrot/loaders/excel.py +199 -0
- parrot/loaders/factory.py +55 -0
- parrot/loaders/files/__init__.py +0 -0
- parrot/loaders/files/abstract.py +39 -0
- parrot/loaders/files/html.py +26 -0
- parrot/loaders/files/text.py +63 -0
- parrot/loaders/html.py +152 -0
- parrot/loaders/markdown.py +442 -0
- parrot/loaders/pdf.py +373 -0
- parrot/loaders/pdfmark.py +320 -0
- parrot/loaders/pdftables.py +506 -0
- parrot/loaders/ppt.py +476 -0
- parrot/loaders/qa.py +63 -0
- parrot/loaders/splitters/__init__.py +10 -0
- parrot/loaders/splitters/base.py +138 -0
- parrot/loaders/splitters/md.py +228 -0
- parrot/loaders/splitters/token.py +143 -0
- parrot/loaders/txt.py +26 -0
- parrot/loaders/video.py +89 -0
- parrot/loaders/videolocal.py +218 -0
- parrot/loaders/videounderstanding.py +377 -0
- parrot/loaders/vimeo.py +167 -0
- parrot/loaders/web.py +599 -0
- parrot/loaders/youtube.py +504 -0
- parrot/manager/__init__.py +5 -0
- parrot/manager/manager.py +1030 -0
- parrot/mcp/__init__.py +28 -0
- parrot/mcp/adapter.py +105 -0
- parrot/mcp/cli.py +174 -0
- parrot/mcp/client.py +119 -0
- parrot/mcp/config.py +75 -0
- parrot/mcp/integration.py +842 -0
- parrot/mcp/oauth.py +933 -0
- parrot/mcp/server.py +225 -0
- parrot/mcp/transports/__init__.py +3 -0
- parrot/mcp/transports/base.py +279 -0
- parrot/mcp/transports/grpc_session.py +163 -0
- parrot/mcp/transports/http.py +312 -0
- parrot/mcp/transports/mcp.proto +108 -0
- parrot/mcp/transports/quic.py +1082 -0
- parrot/mcp/transports/sse.py +330 -0
- parrot/mcp/transports/stdio.py +309 -0
- parrot/mcp/transports/unix.py +395 -0
- parrot/mcp/transports/websocket.py +547 -0
- parrot/memory/__init__.py +16 -0
- parrot/memory/abstract.py +209 -0
- parrot/memory/agent.py +32 -0
- parrot/memory/cache.py +175 -0
- parrot/memory/core.py +555 -0
- parrot/memory/file.py +153 -0
- parrot/memory/mem.py +131 -0
- parrot/memory/redis.py +613 -0
- parrot/models/__init__.py +46 -0
- parrot/models/basic.py +118 -0
- parrot/models/compliance.py +208 -0
- parrot/models/crew.py +395 -0
- parrot/models/detections.py +654 -0
- parrot/models/generation.py +85 -0
- parrot/models/google.py +223 -0
- parrot/models/groq.py +23 -0
- parrot/models/openai.py +30 -0
- parrot/models/outputs.py +285 -0
- parrot/models/responses.py +938 -0
- parrot/notifications/__init__.py +743 -0
- parrot/openapi/__init__.py +3 -0
- parrot/openapi/components.yaml +641 -0
- parrot/openapi/config.py +322 -0
- parrot/outputs/__init__.py +32 -0
- parrot/outputs/formats/__init__.py +108 -0
- parrot/outputs/formats/altair.py +359 -0
- parrot/outputs/formats/application.py +122 -0
- parrot/outputs/formats/base.py +351 -0
- parrot/outputs/formats/bokeh.py +356 -0
- parrot/outputs/formats/card.py +424 -0
- parrot/outputs/formats/chart.py +436 -0
- parrot/outputs/formats/d3.py +255 -0
- parrot/outputs/formats/echarts.py +310 -0
- parrot/outputs/formats/generators/__init__.py +0 -0
- parrot/outputs/formats/generators/abstract.py +61 -0
- parrot/outputs/formats/generators/panel.py +145 -0
- parrot/outputs/formats/generators/streamlit.py +86 -0
- parrot/outputs/formats/generators/terminal.py +63 -0
- parrot/outputs/formats/holoviews.py +310 -0
- parrot/outputs/formats/html.py +147 -0
- parrot/outputs/formats/jinja2.py +46 -0
- parrot/outputs/formats/json.py +87 -0
- parrot/outputs/formats/map.py +933 -0
- parrot/outputs/formats/markdown.py +172 -0
- parrot/outputs/formats/matplotlib.py +237 -0
- parrot/outputs/formats/mixins/__init__.py +0 -0
- parrot/outputs/formats/mixins/emaps.py +855 -0
- parrot/outputs/formats/plotly.py +341 -0
- parrot/outputs/formats/seaborn.py +310 -0
- parrot/outputs/formats/table.py +397 -0
- parrot/outputs/formats/template_report.py +138 -0
- parrot/outputs/formats/yaml.py +125 -0
- parrot/outputs/formatter.py +152 -0
- parrot/outputs/templates/__init__.py +95 -0
- parrot/pipelines/__init__.py +0 -0
- parrot/pipelines/abstract.py +210 -0
- parrot/pipelines/detector.py +124 -0
- parrot/pipelines/models.py +90 -0
- parrot/pipelines/planogram.py +3002 -0
- parrot/pipelines/table.sql +97 -0
- parrot/plugins/__init__.py +106 -0
- parrot/plugins/importer.py +80 -0
- parrot/py.typed +0 -0
- parrot/registry/__init__.py +18 -0
- parrot/registry/registry.py +594 -0
- parrot/scheduler/__init__.py +1189 -0
- parrot/scheduler/models.py +60 -0
- parrot/security/__init__.py +16 -0
- parrot/security/prompt_injection.py +268 -0
- parrot/security/security_events.sql +25 -0
- parrot/services/__init__.py +1 -0
- parrot/services/mcp/__init__.py +8 -0
- parrot/services/mcp/config.py +13 -0
- parrot/services/mcp/server.py +295 -0
- parrot/services/o365_remote_auth.py +235 -0
- parrot/stores/__init__.py +7 -0
- parrot/stores/abstract.py +352 -0
- parrot/stores/arango.py +1090 -0
- parrot/stores/bigquery.py +1377 -0
- parrot/stores/cache.py +106 -0
- parrot/stores/empty.py +10 -0
- parrot/stores/faiss_store.py +1157 -0
- parrot/stores/kb/__init__.py +9 -0
- parrot/stores/kb/abstract.py +68 -0
- parrot/stores/kb/cache.py +165 -0
- parrot/stores/kb/doc.py +325 -0
- parrot/stores/kb/hierarchy.py +346 -0
- parrot/stores/kb/local.py +457 -0
- parrot/stores/kb/prompt.py +28 -0
- parrot/stores/kb/redis.py +659 -0
- parrot/stores/kb/store.py +115 -0
- parrot/stores/kb/user.py +374 -0
- parrot/stores/models.py +59 -0
- parrot/stores/pgvector.py +3 -0
- parrot/stores/postgres.py +2853 -0
- parrot/stores/utils/__init__.py +0 -0
- parrot/stores/utils/chunking.py +197 -0
- parrot/telemetry/__init__.py +3 -0
- parrot/telemetry/mixin.py +111 -0
- parrot/template/__init__.py +3 -0
- parrot/template/engine.py +259 -0
- parrot/tools/__init__.py +23 -0
- parrot/tools/abstract.py +644 -0
- parrot/tools/agent.py +363 -0
- parrot/tools/arangodbsearch.py +537 -0
- parrot/tools/arxiv_tool.py +188 -0
- parrot/tools/calculator/__init__.py +3 -0
- parrot/tools/calculator/operations/__init__.py +38 -0
- parrot/tools/calculator/operations/calculus.py +80 -0
- parrot/tools/calculator/operations/statistics.py +76 -0
- parrot/tools/calculator/tool.py +150 -0
- parrot/tools/cloudwatch.py +988 -0
- parrot/tools/codeinterpreter/__init__.py +127 -0
- parrot/tools/codeinterpreter/executor.py +371 -0
- parrot/tools/codeinterpreter/internals.py +473 -0
- parrot/tools/codeinterpreter/models.py +643 -0
- parrot/tools/codeinterpreter/prompts.py +224 -0
- parrot/tools/codeinterpreter/tool.py +664 -0
- parrot/tools/company_info/__init__.py +6 -0
- parrot/tools/company_info/tool.py +1138 -0
- parrot/tools/correlationanalysis.py +437 -0
- parrot/tools/database/abstract.py +286 -0
- parrot/tools/database/bq.py +115 -0
- parrot/tools/database/cache.py +284 -0
- parrot/tools/database/models.py +95 -0
- parrot/tools/database/pg.py +343 -0
- parrot/tools/databasequery.py +1159 -0
- parrot/tools/db.py +1800 -0
- parrot/tools/ddgo.py +370 -0
- parrot/tools/decorators.py +271 -0
- parrot/tools/dftohtml.py +282 -0
- parrot/tools/document.py +549 -0
- parrot/tools/ecs.py +819 -0
- parrot/tools/edareport.py +368 -0
- parrot/tools/elasticsearch.py +1049 -0
- parrot/tools/employees.py +462 -0
- parrot/tools/epson/__init__.py +96 -0
- parrot/tools/excel.py +683 -0
- parrot/tools/file/__init__.py +13 -0
- parrot/tools/file/abstract.py +76 -0
- parrot/tools/file/gcs.py +378 -0
- parrot/tools/file/local.py +284 -0
- parrot/tools/file/s3.py +511 -0
- parrot/tools/file/tmp.py +309 -0
- parrot/tools/file/tool.py +501 -0
- parrot/tools/file_reader.py +129 -0
- parrot/tools/flowtask/__init__.py +19 -0
- parrot/tools/flowtask/tool.py +761 -0
- parrot/tools/gittoolkit.py +508 -0
- parrot/tools/google/__init__.py +18 -0
- parrot/tools/google/base.py +169 -0
- parrot/tools/google/tools.py +1251 -0
- parrot/tools/googlelocation.py +5 -0
- parrot/tools/googleroutes.py +5 -0
- parrot/tools/googlesearch.py +5 -0
- parrot/tools/googlesitesearch.py +5 -0
- parrot/tools/googlevoice.py +2 -0
- parrot/tools/gvoice.py +695 -0
- parrot/tools/ibisworld/README.md +225 -0
- parrot/tools/ibisworld/__init__.py +11 -0
- parrot/tools/ibisworld/tool.py +366 -0
- parrot/tools/jiratoolkit.py +1718 -0
- parrot/tools/manager.py +1098 -0
- parrot/tools/math.py +152 -0
- parrot/tools/metadata.py +476 -0
- parrot/tools/msteams.py +1621 -0
- parrot/tools/msword.py +635 -0
- parrot/tools/multidb.py +580 -0
- parrot/tools/multistoresearch.py +369 -0
- parrot/tools/networkninja.py +167 -0
- parrot/tools/nextstop/__init__.py +4 -0
- parrot/tools/nextstop/base.py +286 -0
- parrot/tools/nextstop/employee.py +733 -0
- parrot/tools/nextstop/store.py +462 -0
- parrot/tools/notification.py +435 -0
- parrot/tools/o365/__init__.py +42 -0
- parrot/tools/o365/base.py +295 -0
- parrot/tools/o365/bundle.py +522 -0
- parrot/tools/o365/events.py +554 -0
- parrot/tools/o365/mail.py +992 -0
- parrot/tools/o365/onedrive.py +497 -0
- parrot/tools/o365/sharepoint.py +641 -0
- parrot/tools/openapi_toolkit.py +904 -0
- parrot/tools/openweather.py +527 -0
- parrot/tools/pdfprint.py +1001 -0
- parrot/tools/powerbi.py +518 -0
- parrot/tools/powerpoint.py +1113 -0
- parrot/tools/pricestool.py +146 -0
- parrot/tools/products/__init__.py +246 -0
- parrot/tools/prophet_tool.py +171 -0
- parrot/tools/pythonpandas.py +630 -0
- parrot/tools/pythonrepl.py +910 -0
- parrot/tools/qsource.py +436 -0
- parrot/tools/querytoolkit.py +395 -0
- parrot/tools/quickeda.py +827 -0
- parrot/tools/resttool.py +553 -0
- parrot/tools/retail/__init__.py +0 -0
- parrot/tools/retail/bby.py +528 -0
- parrot/tools/sandboxtool.py +703 -0
- parrot/tools/sassie/__init__.py +352 -0
- parrot/tools/scraping/__init__.py +7 -0
- parrot/tools/scraping/docs/select.md +466 -0
- parrot/tools/scraping/documentation.md +1278 -0
- parrot/tools/scraping/driver.py +436 -0
- parrot/tools/scraping/models.py +576 -0
- parrot/tools/scraping/options.py +85 -0
- parrot/tools/scraping/orchestrator.py +517 -0
- parrot/tools/scraping/readme.md +740 -0
- parrot/tools/scraping/tool.py +3115 -0
- parrot/tools/seasonaldetection.py +642 -0
- parrot/tools/shell_tool/__init__.py +5 -0
- parrot/tools/shell_tool/actions.py +408 -0
- parrot/tools/shell_tool/engine.py +155 -0
- parrot/tools/shell_tool/models.py +322 -0
- parrot/tools/shell_tool/tool.py +442 -0
- parrot/tools/site_search.py +214 -0
- parrot/tools/textfile.py +418 -0
- parrot/tools/think.py +378 -0
- parrot/tools/toolkit.py +298 -0
- parrot/tools/webapp_tool.py +187 -0
- parrot/tools/whatif.py +1279 -0
- parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
- parrot/tools/workday/__init__.py +6 -0
- parrot/tools/workday/models.py +1389 -0
- parrot/tools/workday/tool.py +1293 -0
- parrot/tools/yfinance_tool.py +306 -0
- parrot/tools/zipcode.py +217 -0
- parrot/utils/__init__.py +2 -0
- parrot/utils/helpers.py +73 -0
- parrot/utils/parsers/__init__.py +5 -0
- parrot/utils/parsers/toml.c +12078 -0
- parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/parsers/toml.pyx +21 -0
- parrot/utils/toml.py +11 -0
- parrot/utils/types.cpp +20936 -0
- parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/types.pyx +213 -0
- parrot/utils/uv.py +11 -0
- parrot/version.py +10 -0
- parrot/yaml-rs/Cargo.lock +350 -0
- parrot/yaml-rs/Cargo.toml +19 -0
- parrot/yaml-rs/pyproject.toml +19 -0
- parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
- parrot/yaml-rs/src/lib.rs +222 -0
- requirements/docker-compose.yml +24 -0
- requirements/requirements-dev.txt +21 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Dict, Any, Optional
|
|
4
|
+
from aiohttp import web
|
|
5
|
+
import aiohttp
|
|
6
|
+
|
|
7
|
+
from parrot.mcp.config import MCPServerConfig
|
|
8
|
+
from parrot.mcp.transports.base import MCPServerBase
|
|
9
|
+
from parrot.mcp.oauth import OAuthRoutesMixin
|
|
10
|
+
from parrot.mcp.client import MCPClientConfig, MCPConnectionError, MCPAuthHandler
|
|
11
|
+
|
|
12
|
+
class HttpMCPServer(OAuthRoutesMixin, MCPServerBase):
|
|
13
|
+
"""MCP server using HTTP transport."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, config: MCPServerConfig, parent_app: Optional[web.Application] = None):
|
|
16
|
+
super().__init__(config)
|
|
17
|
+
self.app = web.Application()
|
|
18
|
+
self.runner = None
|
|
19
|
+
self.site = None
|
|
20
|
+
self.parent_app = parent_app
|
|
21
|
+
|
|
22
|
+
if config.enable_oauth:
|
|
23
|
+
self._init_oauth_support()
|
|
24
|
+
|
|
25
|
+
async def start(self):
|
|
26
|
+
"""Start the HTTP server."""
|
|
27
|
+
# Setup routes
|
|
28
|
+
self.app.router.add_post("/mcp", self._handle_http_request)
|
|
29
|
+
self.app.router.add_get("/mcp/info", self._handle_info)
|
|
30
|
+
|
|
31
|
+
if self.config.enable_oauth:
|
|
32
|
+
self._add_oauth_routes(self.app.router)
|
|
33
|
+
|
|
34
|
+
self.logger.info(
|
|
35
|
+
f"Starting HTTP MCP server on {self.config.host}:{self.config.port}"
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
if self.parent_app:
|
|
39
|
+
# If running as sub-app, just register the sub-app
|
|
40
|
+
self.parent_app.add_subapp(self.config.base_path, self.app)
|
|
41
|
+
self.logger.info(f"Mounted at {self.config.base_path}")
|
|
42
|
+
else:
|
|
43
|
+
# Run standalone
|
|
44
|
+
self.runner = web.AppRunner(self.app)
|
|
45
|
+
await self.runner.setup()
|
|
46
|
+
self.site = web.TCPSite(
|
|
47
|
+
self.runner,
|
|
48
|
+
self.config.host,
|
|
49
|
+
self.config.port
|
|
50
|
+
)
|
|
51
|
+
await self.site.start()
|
|
52
|
+
|
|
53
|
+
async def stop(self):
|
|
54
|
+
"""Stop the HTTP server."""
|
|
55
|
+
if self.runner:
|
|
56
|
+
await self.runner.cleanup()
|
|
57
|
+
|
|
58
|
+
async def _handle_http_request(self, request: web.Request) -> web.Response:
|
|
59
|
+
"""Handle incoming JSON-RPC over HTTP."""
|
|
60
|
+
try:
|
|
61
|
+
# Check authentication (async to support all auth methods)
|
|
62
|
+
auth_response = await self._authenticate_request(request)
|
|
63
|
+
if auth_response:
|
|
64
|
+
return auth_response
|
|
65
|
+
|
|
66
|
+
data = await request.json()
|
|
67
|
+
response = await self._handle_request(data)
|
|
68
|
+
|
|
69
|
+
if response:
|
|
70
|
+
# Convert tools to Anthropic format if needed
|
|
71
|
+
if "result" in response and "tools" in response["result"]:
|
|
72
|
+
# Check User-Agent or header for Anthropic
|
|
73
|
+
if "Anthropic" in request.headers.get("User-Agent", ""):
|
|
74
|
+
response["result"] = self._convert_tools_to_anthropic(response["result"])
|
|
75
|
+
|
|
76
|
+
return web.json_response(response)
|
|
77
|
+
else:
|
|
78
|
+
return web.Response(status=204) # No content
|
|
79
|
+
|
|
80
|
+
except json.JSONDecodeError:
|
|
81
|
+
return web.json_response(
|
|
82
|
+
{"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": None},
|
|
83
|
+
status=400
|
|
84
|
+
)
|
|
85
|
+
except Exception as e:
|
|
86
|
+
self.logger.error(f"HTTP request error: {e}")
|
|
87
|
+
return web.json_response(
|
|
88
|
+
{"jsonrpc": "2.0", "error": {"code": -32603, "message": str(e)}, "id": None},
|
|
89
|
+
status=500
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
def _convert_tools_to_anthropic(self, mcp_result: Dict[str, Any]) -> Dict[str, Any]:
|
|
93
|
+
"""Convert standard MCP tool list to Anthropic-compatible format."""
|
|
94
|
+
# Anthropic expects specific structure, this is a placeholder for logic
|
|
95
|
+
# For now, just return as is or adapt lightly
|
|
96
|
+
return mcp_result
|
|
97
|
+
|
|
98
|
+
async def _handle_info(self, request: web.Request) -> web.Response:
|
|
99
|
+
"""Return server info."""
|
|
100
|
+
return web.json_response({
|
|
101
|
+
"name": self.config.name,
|
|
102
|
+
"version": self.config.version,
|
|
103
|
+
"transport": "http",
|
|
104
|
+
"tools_count": len(self.tools)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
async def _handle_request(self, request: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
108
|
+
"""Handle JSON-RPC request."""
|
|
109
|
+
# This reuses the logic from stdio but returns dict instead of printing
|
|
110
|
+
method = request.get("method")
|
|
111
|
+
params = request.get("params", {})
|
|
112
|
+
request_id = request.get("id")
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
if method == "initialize":
|
|
116
|
+
result = await self.handle_initialize(params)
|
|
117
|
+
elif method == "tools/list":
|
|
118
|
+
result = await self.handle_tools_list(params)
|
|
119
|
+
elif method == "tools/call":
|
|
120
|
+
result = await self.handle_tools_call(params)
|
|
121
|
+
elif method == "notifications/initialized":
|
|
122
|
+
return None
|
|
123
|
+
else:
|
|
124
|
+
raise RuntimeError(f"Unknown method: {method}")
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
"jsonrpc": "2.0",
|
|
128
|
+
"id": request_id,
|
|
129
|
+
"result": result
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
except Exception as e:
|
|
133
|
+
return {
|
|
134
|
+
"jsonrpc": "2.0",
|
|
135
|
+
"id": request_id,
|
|
136
|
+
"error": {
|
|
137
|
+
"code": -32603,
|
|
138
|
+
"message": str(e)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class HttpMCPSession:
|
|
144
|
+
"""MCP session for HTTP/SSE transport using aiohttp."""
|
|
145
|
+
|
|
146
|
+
def __init__(self, config: MCPClientConfig, logger):
|
|
147
|
+
self.config = config
|
|
148
|
+
self.logger = logger
|
|
149
|
+
self._request_id = 0
|
|
150
|
+
self._session = None
|
|
151
|
+
self._auth_handler = None
|
|
152
|
+
self._initialized = False
|
|
153
|
+
self._base_headers = {}
|
|
154
|
+
|
|
155
|
+
async def connect(self):
|
|
156
|
+
"""Connect to MCP server via HTTP."""
|
|
157
|
+
try:
|
|
158
|
+
# Setup authentication
|
|
159
|
+
if self.config.auth_type:
|
|
160
|
+
self._auth_handler = MCPAuthHandler(
|
|
161
|
+
self.config.auth_type,
|
|
162
|
+
self.config.auth_config
|
|
163
|
+
)
|
|
164
|
+
auth_headers = await self._auth_handler.get_auth_headers()
|
|
165
|
+
self._base_headers.update(auth_headers)
|
|
166
|
+
|
|
167
|
+
# Add custom headers
|
|
168
|
+
self._base_headers.update(self.config.headers)
|
|
169
|
+
|
|
170
|
+
print('THIS > ', self._base_headers)
|
|
171
|
+
|
|
172
|
+
# Create HTTP session
|
|
173
|
+
timeout = aiohttp.ClientTimeout(total=self.config.timeout)
|
|
174
|
+
self._session = aiohttp.ClientSession(
|
|
175
|
+
timeout=timeout,
|
|
176
|
+
headers=self._base_headers
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# Initialize MCP session
|
|
180
|
+
await self._initialize_session()
|
|
181
|
+
self._initialized = True
|
|
182
|
+
self.logger.info(f"HTTP connection established to {self.config.name}")
|
|
183
|
+
|
|
184
|
+
except Exception as e:
|
|
185
|
+
await self.disconnect()
|
|
186
|
+
raise MCPConnectionError(f"HTTP connection failed: {e}") from e
|
|
187
|
+
|
|
188
|
+
async def _initialize_session(self):
|
|
189
|
+
"""Initialize MCP session over HTTP."""
|
|
190
|
+
try:
|
|
191
|
+
init_result = await self._send_request("initialize", {
|
|
192
|
+
"protocolVersion": "2024-11-05",
|
|
193
|
+
"capabilities": {"tools": {}},
|
|
194
|
+
"clientInfo": {"name": "ai-parrot-mcp-client", "version": "1.0.0"}
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
# Send initialized notification
|
|
198
|
+
await self._send_notification("notifications/initialized")
|
|
199
|
+
|
|
200
|
+
except Exception as e:
|
|
201
|
+
raise MCPConnectionError(f"HTTP session initialization failed: {e}") from e
|
|
202
|
+
|
|
203
|
+
async def _send_request(self, method: str, params: dict = None) -> dict:
|
|
204
|
+
"""Send JSON-RPC request via HTTP."""
|
|
205
|
+
if not self._session:
|
|
206
|
+
raise MCPConnectionError("HTTP session not established")
|
|
207
|
+
|
|
208
|
+
request_id = self._get_next_id()
|
|
209
|
+
request = {"jsonrpc": "2.0", "id": request_id, "method": method}
|
|
210
|
+
if params:
|
|
211
|
+
request["params"] = params
|
|
212
|
+
|
|
213
|
+
try:
|
|
214
|
+
self.logger.debug(f"HTTP sending: {json.dumps(request)}")
|
|
215
|
+
|
|
216
|
+
async with self._session.post(
|
|
217
|
+
self.config.url,
|
|
218
|
+
json=request,
|
|
219
|
+
headers={
|
|
220
|
+
"Content-Type": "application/json",
|
|
221
|
+
"Accept": "application/json"
|
|
222
|
+
}
|
|
223
|
+
) as response:
|
|
224
|
+
|
|
225
|
+
if response.status != 200:
|
|
226
|
+
raise MCPConnectionError(f"HTTP error: {response.status}")
|
|
227
|
+
|
|
228
|
+
response_data = await response.json()
|
|
229
|
+
self.logger.debug(f"HTTP received: {json.dumps(response_data)}")
|
|
230
|
+
|
|
231
|
+
if "error" in response_data:
|
|
232
|
+
error = response_data["error"]
|
|
233
|
+
raise MCPConnectionError(f"Server error: {error}")
|
|
234
|
+
|
|
235
|
+
return response_data.get("result", {})
|
|
236
|
+
|
|
237
|
+
except Exception as e:
|
|
238
|
+
if isinstance(e, MCPConnectionError):
|
|
239
|
+
raise
|
|
240
|
+
raise MCPConnectionError(f"HTTP request failed: {e}") from e
|
|
241
|
+
|
|
242
|
+
async def _send_notification(self, method: str, params: dict = None):
|
|
243
|
+
"""Send JSON-RPC notification via HTTP."""
|
|
244
|
+
notification = {"jsonrpc": "2.0", "method": method}
|
|
245
|
+
if params:
|
|
246
|
+
notification["params"] = params
|
|
247
|
+
|
|
248
|
+
try:
|
|
249
|
+
self.logger.debug(f"HTTP notification: {json.dumps(notification)}")
|
|
250
|
+
|
|
251
|
+
async with self._session.post(
|
|
252
|
+
self.config.url,
|
|
253
|
+
json=notification,
|
|
254
|
+
headers={
|
|
255
|
+
"Content-Type": "application/json",
|
|
256
|
+
"Accept": "application/json"
|
|
257
|
+
}
|
|
258
|
+
) as response:
|
|
259
|
+
# Notifications don't expect responses
|
|
260
|
+
pass
|
|
261
|
+
|
|
262
|
+
except Exception as e:
|
|
263
|
+
self.logger.debug(f"Notification error (ignored): {e}")
|
|
264
|
+
|
|
265
|
+
def _get_next_id(self):
|
|
266
|
+
self._request_id += 1
|
|
267
|
+
return self._request_id
|
|
268
|
+
|
|
269
|
+
async def list_tools(self):
|
|
270
|
+
"""List available tools via HTTP."""
|
|
271
|
+
if not self._initialized:
|
|
272
|
+
raise MCPConnectionError("Session not initialized")
|
|
273
|
+
|
|
274
|
+
result = await self._send_request("tools/list")
|
|
275
|
+
tools = result.get("tools", [])
|
|
276
|
+
|
|
277
|
+
tool_objects = []
|
|
278
|
+
for tool_dict in tools:
|
|
279
|
+
tool_obj = type('MCPTool', (), tool_dict)()
|
|
280
|
+
tool_objects.append(tool_obj)
|
|
281
|
+
|
|
282
|
+
return tool_objects
|
|
283
|
+
|
|
284
|
+
async def call_tool(self, tool_name: str, arguments: dict):
|
|
285
|
+
"""Call a tool via HTTP."""
|
|
286
|
+
if not self._initialized:
|
|
287
|
+
raise MCPConnectionError("Session not initialized")
|
|
288
|
+
|
|
289
|
+
result = await self._send_request("tools/call", {
|
|
290
|
+
"name": tool_name,
|
|
291
|
+
"arguments": arguments
|
|
292
|
+
})
|
|
293
|
+
|
|
294
|
+
content_items = []
|
|
295
|
+
if "content" in result:
|
|
296
|
+
for item in result["content"]:
|
|
297
|
+
content_obj = type('ContentItem', (), item)()
|
|
298
|
+
content_items.append(content_obj)
|
|
299
|
+
|
|
300
|
+
result_obj = type('ToolCallResult', (), {"content": content_items})()
|
|
301
|
+
return result_obj
|
|
302
|
+
|
|
303
|
+
async def disconnect(self):
|
|
304
|
+
"""Disconnect HTTP session."""
|
|
305
|
+
self._initialized = False
|
|
306
|
+
|
|
307
|
+
if self._session:
|
|
308
|
+
await self._session.close()
|
|
309
|
+
self._session = None
|
|
310
|
+
|
|
311
|
+
self._auth_handler = None
|
|
312
|
+
self._base_headers.clear()
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// mcp.proto
|
|
2
|
+
syntax = "proto3";
|
|
3
|
+
|
|
4
|
+
package mcp;
|
|
5
|
+
|
|
6
|
+
option go_package = "parrot/mcp/proto";
|
|
7
|
+
|
|
8
|
+
// Hybrid approach: JSON-RPC wrapped in protobuf
|
|
9
|
+
service MCPService {
|
|
10
|
+
// Bidirectional streaming for full duplex communication
|
|
11
|
+
rpc BiDirectionalStream(stream MCPRequest) returns (stream MCPResponse);
|
|
12
|
+
|
|
13
|
+
// Unary calls for simple request/response
|
|
14
|
+
rpc Initialize(InitializeRequest) returns (InitializeResponse);
|
|
15
|
+
rpc ListTools(ListToolsRequest) returns (ListToolsResponse);
|
|
16
|
+
rpc CallTool(CallToolRequest) returns (CallToolResponse);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Wrapper for JSON-RPC messages (backwards compatible)
|
|
20
|
+
message MCPRequest {
|
|
21
|
+
oneof payload {
|
|
22
|
+
string json_rpc_message = 1; // JSON-RPC 2.0 string
|
|
23
|
+
NativeRequest native = 2; // Native protobuf (more efficient)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
message MCPResponse {
|
|
28
|
+
oneof payload {
|
|
29
|
+
string json_rpc_message = 1;
|
|
30
|
+
NativeResponse native = 2;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Native protobuf messages (optional, for maximum efficiency)
|
|
35
|
+
message NativeRequest {
|
|
36
|
+
int64 id = 1;
|
|
37
|
+
string method = 2;
|
|
38
|
+
bytes params = 3; // MessagePack or JSON bytes
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
message NativeResponse {
|
|
42
|
+
int64 id = 1;
|
|
43
|
+
bytes result = 2;
|
|
44
|
+
Error error = 3;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
message Error {
|
|
48
|
+
int32 code = 1;
|
|
49
|
+
string message = 2;
|
|
50
|
+
bytes data = 3;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Typed messages for common operations
|
|
54
|
+
message InitializeRequest {
|
|
55
|
+
string protocol_version = 1;
|
|
56
|
+
ClientInfo client_info = 2;
|
|
57
|
+
Capabilities capabilities = 3;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
message InitializeResponse {
|
|
61
|
+
string protocol_version = 1;
|
|
62
|
+
ServerInfo server_info = 2;
|
|
63
|
+
Capabilities capabilities = 3;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
message ClientInfo {
|
|
67
|
+
string name = 1;
|
|
68
|
+
string version = 2;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
message ServerInfo {
|
|
72
|
+
string name = 1;
|
|
73
|
+
string version = 2;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
message Capabilities {
|
|
77
|
+
bool tools = 1;
|
|
78
|
+
bool resources = 2;
|
|
79
|
+
bool prompts = 3;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
message ListToolsRequest {}
|
|
83
|
+
|
|
84
|
+
message ListToolsResponse {
|
|
85
|
+
repeated Tool tools = 1;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
message Tool {
|
|
89
|
+
string name = 1;
|
|
90
|
+
string description = 2;
|
|
91
|
+
bytes input_schema = 3; // JSON Schema as bytes
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
message CallToolRequest {
|
|
95
|
+
string name = 1;
|
|
96
|
+
bytes arguments = 2; // JSON arguments
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
message CallToolResponse {
|
|
100
|
+
repeated Content content = 1;
|
|
101
|
+
bool is_error = 2;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
message Content {
|
|
105
|
+
string type = 1;
|
|
106
|
+
string text = 2;
|
|
107
|
+
bytes data = 3;
|
|
108
|
+
}
|