connectkit 0.1.0__py3-none-any.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.
- connectkit/__init__.py +26 -0
- connectkit/backends/__init__.py +0 -0
- connectkit/backends/cli.py +220 -0
- connectkit/backends/mcp.py +87 -0
- connectkit/bridge.py +116 -0
- connectkit/connectors/accelo.yaml +26 -0
- connectkit/connectors/active-campaign.yaml +28 -0
- connectkit/connectors/acuity-scheduling.yaml +20 -0
- connectkit/connectors/addepar.yaml +26 -0
- connectkit/connectors/adobe-commerce.yaml +34 -0
- connectkit/connectors/adobe-workfront.yaml +26 -0
- connectkit/connectors/adobe.yaml +20 -0
- connectkit/connectors/adyen.yaml +32 -0
- connectkit/connectors/affinity-v2.yaml +22 -0
- connectkit/connectors/affinity.yaml +22 -0
- connectkit/connectors/aimfox.yaml +22 -0
- connectkit/connectors/aircall.yaml +20 -0
- connectkit/connectors/airtable.yaml +47 -0
- connectkit/connectors/algolia.yaml +31 -0
- connectkit/connectors/amazon-selling-partner.yaml +46 -0
- connectkit/connectors/amazon.yaml +26 -0
- connectkit/connectors/amplitude.yaml +34 -0
- connectkit/connectors/anrok.yaml +22 -0
- connectkit/connectors/anthropic.yaml +28 -0
- connectkit/connectors/apaleo.yaml +20 -0
- connectkit/connectors/apify.yaml +25 -0
- connectkit/connectors/apollo.yaml +22 -0
- connectkit/connectors/apple-app-store.yaml +16 -0
- connectkit/connectors/appstle-subscriptions.yaml +22 -0
- connectkit/connectors/asana.yaml +20 -0
- connectkit/connectors/ashby.yaml +22 -0
- connectkit/connectors/atlas-so.yaml +22 -0
- connectkit/connectors/atlassian-service-account-api-token.yaml +34 -0
- connectkit/connectors/atlassian.yaml +26 -0
- connectkit/connectors/attention.yaml +22 -0
- connectkit/connectors/attio.yaml +20 -0
- connectkit/connectors/auth0.yaml +28 -0
- connectkit/connectors/autodesk.yaml +20 -0
- connectkit/connectors/autotask.yaml +40 -0
- connectkit/connectors/auvik.yaml +34 -0
- connectkit/connectors/avalara.yaml +34 -0
- connectkit/connectors/avoma.yaml +22 -0
- connectkit/connectors/aws-iam.yaml +34 -0
- connectkit/connectors/aws-inspector2.yaml +34 -0
- connectkit/connectors/aws-multi-service.yaml +40 -0
- connectkit/connectors/aws.yaml +38 -0
- connectkit/connectors/axiom.yaml +28 -0
- connectkit/connectors/azure-devops.yaml +28 -0
- connectkit/connectors/bamboohr.yaml +31 -0
- connectkit/connectors/basecamp.yaml +34 -0
- connectkit/connectors/battlenet.yaml +32 -0
- connectkit/connectors/beehiiv.yaml +28 -0
- connectkit/connectors/bettercontact.yaml +22 -0
- connectkit/connectors/bigcommerce.yaml +35 -0
- connectkit/connectors/bill.yaml +20 -0
- connectkit/connectors/bing-webmasters.yaml +20 -0
- connectkit/connectors/bird.yaml +34 -0
- connectkit/connectors/bitbucket.yaml +23 -0
- connectkit/connectors/bitdefender.yaml +28 -0
- connectkit/connectors/bitly.yaml +20 -0
- connectkit/connectors/blackbaud.yaml +20 -0
- connectkit/connectors/blandai.yaml +22 -0
- connectkit/connectors/boldsign.yaml +20 -0
- connectkit/connectors/booking-com.yaml +34 -0
- connectkit/connectors/box.yaml +62 -0
- connectkit/connectors/braintree.yaml +23 -0
- connectkit/connectors/braze.yaml +28 -0
- connectkit/connectors/brevo-api-key.yaml +22 -0
- connectkit/connectors/brex-api-key.yaml +22 -0
- connectkit/connectors/brex-staging.yaml +20 -0
- connectkit/connectors/brex.yaml +24 -0
- connectkit/connectors/builder-io-private.yaml +28 -0
- connectkit/connectors/builder-io-public.yaml +28 -0
- connectkit/connectors/buildium.yaml +28 -0
- connectkit/connectors/builtwith.yaml +22 -0
- connectkit/connectors/bullhorn.yaml +42 -0
- connectkit/connectors/cal-com-v1.yaml +22 -0
- connectkit/connectors/cal-com-v2.yaml +22 -0
- connectkit/connectors/calendly.yaml +20 -0
- connectkit/connectors/callrail.yaml +22 -0
- connectkit/connectors/candis.yaml +20 -0
- connectkit/connectors/canny.yaml +22 -0
- connectkit/connectors/canva.yaml +20 -0
- connectkit/connectors/canvas-lms.yaml +26 -0
- connectkit/connectors/certn.yaml +22 -0
- connectkit/connectors/chargebee.yaml +28 -0
- connectkit/connectors/chattermill.yaml +28 -0
- connectkit/connectors/checkhq.yaml +22 -0
- connectkit/connectors/checkr-partner-staging.yaml +26 -0
- connectkit/connectors/checkr-partner.yaml +26 -0
- connectkit/connectors/chorus.yaml +22 -0
- connectkit/connectors/cin7-core.yaml +28 -0
- connectkit/connectors/circle-so.yaml +22 -0
- connectkit/connectors/clari-copilot.yaml +28 -0
- connectkit/connectors/clay.yaml +28 -0
- connectkit/connectors/clearbit.yaml +46 -0
- connectkit/connectors/clerk.yaml +22 -0
- connectkit/connectors/cleverreach.yaml +22 -0
- connectkit/connectors/clickhouse.yaml +28 -0
- connectkit/connectors/clicksend.yaml +28 -0
- connectkit/connectors/clickup.yaml +51 -0
- connectkit/connectors/clio.yaml +27 -0
- connectkit/connectors/close.yaml +23 -0
- connectkit/connectors/cloudbeds.yaml +20 -0
- connectkit/connectors/cloudflare.yaml +25 -0
- connectkit/connectors/cloudtalk.yaml +28 -0
- connectkit/connectors/clover.yaml +32 -0
- connectkit/connectors/coda.yaml +22 -0
- connectkit/connectors/codeclimate.yaml +28 -0
- connectkit/connectors/codegen.yaml +22 -0
- connectkit/connectors/companycam.yaml +22 -0
- connectkit/connectors/connectwise-psa-staging.yaml +28 -0
- connectkit/connectors/connectwise-psa.yaml +52 -0
- connectkit/connectors/constant-contact.yaml +20 -0
- connectkit/connectors/conta-azul.yaml +20 -0
- connectkit/connectors/contactout.yaml +22 -0
- connectkit/connectors/contentful.yaml +29 -0
- connectkit/connectors/contentstack.yaml +38 -0
- connectkit/connectors/convertkit.yaml +42 -0
- connectkit/connectors/copper-api-key.yaml +28 -0
- connectkit/connectors/copper.yaml +20 -0
- connectkit/connectors/coros.yaml +20 -0
- connectkit/connectors/crisp-plugin-install.yaml +20 -0
- connectkit/connectors/crisp.yaml +28 -0
- connectkit/connectors/crunchbase.yaml +22 -0
- connectkit/connectors/cursor.yaml +22 -0
- connectkit/connectors/customerio.yaml +57 -0
- connectkit/connectors/cyberimpact.yaml +22 -0
- connectkit/connectors/databricks.yaml +56 -0
- connectkit/connectors/datacandy.yaml +46 -0
- connectkit/connectors/datadog.yaml +60 -0
- connectkit/connectors/datev.yaml +23 -0
- connectkit/connectors/datto-rmm.yaml +26 -0
- connectkit/connectors/deel.yaml +20 -0
- connectkit/connectors/deepl.yaml +52 -0
- connectkit/connectors/demodesk.yaml +22 -0
- connectkit/connectors/devin.yaml +22 -0
- connectkit/connectors/dialpad.yaml +20 -0
- connectkit/connectors/digitalocean.yaml +23 -0
- connectkit/connectors/discord.yaml +48 -0
- connectkit/connectors/discourse.yaml +34 -0
- connectkit/connectors/dixa.yaml +28 -0
- connectkit/connectors/document360.yaml +22 -0
- connectkit/connectors/docusign.yaml +20 -0
- connectkit/connectors/drata.yaml +22 -0
- connectkit/connectors/drchrono.yaml +20 -0
- connectkit/connectors/dropbox-sign.yaml +20 -0
- connectkit/connectors/dropbox.yaml +60 -0
- connectkit/connectors/e-conomic.yaml +28 -0
- connectkit/connectors/ebay.yaml +20 -0
- connectkit/connectors/egnyte.yaml +26 -0
- connectkit/connectors/elasticsearch.yaml +65 -0
- connectkit/connectors/elevenlabs.yaml +22 -0
- connectkit/connectors/elevio.yaml +28 -0
- connectkit/connectors/emarsys.yaml +32 -0
- connectkit/connectors/employment-hero.yaml +20 -0
- connectkit/connectors/entrata.yaml +22 -0
- connectkit/connectors/envoy.yaml +20 -0
- connectkit/connectors/epic-games.yaml +20 -0
- connectkit/connectors/evaluagent.yaml +34 -0
- connectkit/connectors/eventbrite.yaml +20 -0
- connectkit/connectors/exa.yaml +22 -0
- connectkit/connectors/exact-online.yaml +26 -0
- connectkit/connectors/exist.yaml +20 -0
- connectkit/connectors/expensify.yaml +28 -0
- connectkit/connectors/facebook.yaml +20 -0
- connectkit/connectors/factorial.yaml +20 -0
- connectkit/connectors/fairing.yaml +22 -0
- connectkit/connectors/falai.yaml +22 -0
- connectkit/connectors/fanvue.yaml +27 -0
- connectkit/connectors/fathom.yaml +22 -0
- connectkit/connectors/fellow.yaml +28 -0
- connectkit/connectors/fiber-ai.yaml +22 -0
- connectkit/connectors/figma.yaml +50 -0
- connectkit/connectors/fillout-api-key.yaml +28 -0
- connectkit/connectors/fillout.yaml +26 -0
- connectkit/connectors/findymail.yaml +22 -0
- connectkit/connectors/firecrawl.yaml +51 -0
- connectkit/connectors/fireflies.yaml +22 -0
- connectkit/connectors/firstbase.yaml +22 -0
- connectkit/connectors/fiserv-api-key.yaml +22 -0
- connectkit/connectors/fitbit.yaml +20 -0
- connectkit/connectors/float.yaml +28 -0
- connectkit/connectors/folk.yaml +22 -0
- connectkit/connectors/fortnox.yaml +22 -0
- connectkit/connectors/freeagent.yaml +20 -0
- connectkit/connectors/freepik.yaml +22 -0
- connectkit/connectors/freshbooks.yaml +20 -0
- connectkit/connectors/freshdesk.yaml +31 -0
- connectkit/connectors/freshsales.yaml +34 -0
- connectkit/connectors/freshservice.yaml +28 -0
- connectkit/connectors/freshteam.yaml +28 -0
- connectkit/connectors/front-api-key.yaml +22 -0
- connectkit/connectors/front.yaml +20 -0
- connectkit/connectors/ftp.yaml +66 -0
- connectkit/connectors/fullenrich.yaml +22 -0
- connectkit/connectors/gamma.yaml +22 -0
- connectkit/connectors/garmin.yaml +20 -0
- connectkit/connectors/gebruder-weiss.yaml +20 -0
- connectkit/connectors/gem.yaml +28 -0
- connectkit/connectors/gerrit.yaml +22 -0
- connectkit/connectors/getresponse.yaml +42 -0
- connectkit/connectors/ghost-content.yaml +34 -0
- connectkit/connectors/github-app.yaml +28 -0
- connectkit/connectors/github.yaml +80 -0
- connectkit/connectors/gitlab.yaml +70 -0
- connectkit/connectors/glyphic.yaml +22 -0
- connectkit/connectors/gong.yaml +31 -0
- connectkit/connectors/google-ads.yaml +61 -0
- connectkit/connectors/google-analytics.yaml +59 -0
- connectkit/connectors/google-gemini.yaml +22 -0
- connectkit/connectors/google-maps.yaml +22 -0
- connectkit/connectors/google-play.yaml +23 -0
- connectkit/connectors/google-workspace.yaml +69 -0
- connectkit/connectors/google.yaml +23 -0
- connectkit/connectors/gorgias.yaml +26 -0
- connectkit/connectors/grafana.yaml +31 -0
- connectkit/connectors/grain-api-key.yaml +22 -0
- connectkit/connectors/grain.yaml +20 -0
- connectkit/connectors/granola.yaml +22 -0
- connectkit/connectors/greenhouse-assessment.yaml +28 -0
- connectkit/connectors/greenhouse-harvest-partner.yaml +20 -0
- connectkit/connectors/greenhouse-harvest.yaml +22 -0
- connectkit/connectors/greenhouse-ingestion.yaml +20 -0
- connectkit/connectors/greenhouse-job-board.yaml +28 -0
- connectkit/connectors/greenhouse-onboarding.yaml +28 -0
- connectkit/connectors/greenhouse.yaml +26 -0
- connectkit/connectors/grist.yaml +28 -0
- connectkit/connectors/gumroad.yaml +20 -0
- connectkit/connectors/guru.yaml +28 -0
- connectkit/connectors/gusto-demo.yaml +20 -0
- connectkit/connectors/gusto.yaml +20 -0
- connectkit/connectors/hackerrank-work.yaml +22 -0
- connectkit/connectors/harvest.yaml +26 -0
- connectkit/connectors/health-gorilla.yaml +20 -0
- connectkit/connectors/helpscout-docs.yaml +22 -0
- connectkit/connectors/helpscout-mailbox.yaml +20 -0
- connectkit/connectors/hex.yaml +28 -0
- connectkit/connectors/heygen.yaml +20 -0
- connectkit/connectors/heymarket.yaml +32 -0
- connectkit/connectors/heyreach.yaml +22 -0
- connectkit/connectors/hibob-service-user.yaml +28 -0
- connectkit/connectors/highlevel-white-label.yaml +20 -0
- connectkit/connectors/highlevel.yaml +20 -0
- connectkit/connectors/holded.yaml +22 -0
- connectkit/connectors/hover.yaml +20 -0
- connectkit/connectors/hubspot.yaml +64 -0
- connectkit/connectors/icypeas.yaml +22 -0
- connectkit/connectors/incident-io.yaml +25 -0
- connectkit/connectors/insightly.yaml +28 -0
- connectkit/connectors/instagram.yaml +20 -0
- connectkit/connectors/instantly.yaml +22 -0
- connectkit/connectors/intercom.yaml +29 -0
- connectkit/connectors/intuit.yaml +20 -0
- connectkit/connectors/ironclad.yaml +26 -0
- connectkit/connectors/itglue.yaml +28 -0
- connectkit/connectors/jazzhr.yaml +22 -0
- connectkit/connectors/jira-data-center-api-key.yaml +28 -0
- connectkit/connectors/jira-data-center.yaml +26 -0
- connectkit/connectors/jira.yaml +73 -0
- connectkit/connectors/jobadder.yaml +20 -0
- connectkit/connectors/jobber.yaml +26 -0
- connectkit/connectors/jobvite.yaml +28 -0
- connectkit/connectors/jotform.yaml +22 -0
- connectkit/connectors/jumpcloud.yaml +22 -0
- connectkit/connectors/juniper-mist.yaml +28 -0
- connectkit/connectors/justworks.yaml +20 -0
- connectkit/connectors/kafka.yaml +70 -0
- connectkit/connectors/kandji.yaml +28 -0
- connectkit/connectors/keap.yaml +20 -0
- connectkit/connectors/kintone-user-api.yaml +28 -0
- connectkit/connectors/kintone.yaml +26 -0
- connectkit/connectors/klaviyo.yaml +22 -0
- connectkit/connectors/klicktipp.yaml +22 -0
- connectkit/connectors/klipfolio.yaml +22 -0
- connectkit/connectors/knowbe4.yaml +28 -0
- connectkit/connectors/kustomer.yaml +28 -0
- connectkit/connectors/lagrowthmachine.yaml +22 -0
- connectkit/connectors/lastpass.yaml +28 -0
- connectkit/connectors/lattice.yaml +22 -0
- connectkit/connectors/leadmagic.yaml +22 -0
- connectkit/connectors/lemlist.yaml +22 -0
- connectkit/connectors/lessonly.yaml +28 -0
- connectkit/connectors/lever.yaml +22 -0
- connectkit/connectors/lightspeed-retail.yaml +26 -0
- connectkit/connectors/linear.yaml +65 -0
- connectkit/connectors/linkedin.yaml +20 -0
- connectkit/connectors/linkhut.yaml +20 -0
- connectkit/connectors/listmonk.yaml +34 -0
- connectkit/connectors/lob.yaml +22 -0
- connectkit/connectors/lokalise.yaml +20 -0
- connectkit/connectors/loop-returns.yaml +22 -0
- connectkit/connectors/loops-so.yaml +22 -0
- connectkit/connectors/luma.yaml +22 -0
- connectkit/connectors/lumos.yaml +22 -0
- connectkit/connectors/mailchimp.yaml +29 -0
- connectkit/connectors/mailerlite.yaml +42 -0
- connectkit/connectors/mailgun.yaml +22 -0
- connectkit/connectors/mailjet.yaml +28 -0
- connectkit/connectors/make.yaml +28 -0
- connectkit/connectors/manatal.yaml +22 -0
- connectkit/connectors/maximizer-on-premise.yaml +26 -0
- connectkit/connectors/maximizer.yaml +32 -0
- connectkit/connectors/maxio.yaml +28 -0
- connectkit/connectors/mcp-generic.yaml +26 -0
- connectkit/connectors/mercury.yaml +20 -0
- connectkit/connectors/metabase.yaml +31 -0
- connectkit/connectors/microsoft-365.yaml +66 -0
- connectkit/connectors/microsoft-dynamics.yaml +75 -0
- connectkit/connectors/microsoft-entra-id.yaml +68 -0
- connectkit/connectors/microsoft-teams-bot.yaml +35 -0
- connectkit/connectors/microsoft-tenant-specific.yaml +29 -0
- connectkit/connectors/microsoft.yaml +23 -0
- connectkit/connectors/mindbody.yaml +34 -0
- connectkit/connectors/minimax.yaml +28 -0
- connectkit/connectors/miro.yaml +20 -0
- connectkit/connectors/missive.yaml +22 -0
- connectkit/connectors/mixpanel.yaml +31 -0
- connectkit/connectors/mollie.yaml +20 -0
- connectkit/connectors/momentum-io.yaml +22 -0
- connectkit/connectors/monday.yaml +61 -0
- connectkit/connectors/mongodb.yaml +55 -0
- connectkit/connectors/mural.yaml +20 -0
- connectkit/connectors/mysql.yaml +66 -0
- connectkit/connectors/namely.yaml +26 -0
- connectkit/connectors/nationbuilder.yaml +26 -0
- connectkit/connectors/netlify.yaml +42 -0
- connectkit/connectors/netsuite-tba.yaml +20 -0
- connectkit/connectors/netsuite.yaml +31 -0
- connectkit/connectors/next-cloud-ocs.yaml +22 -0
- connectkit/connectors/nocrm.yaml +28 -0
- connectkit/connectors/northbeam.yaml +34 -0
- connectkit/connectors/notion.yaml +55 -0
- connectkit/connectors/nyne-ai.yaml +28 -0
- connectkit/connectors/ocean-io.yaml +22 -0
- connectkit/connectors/odoo.yaml +26 -0
- connectkit/connectors/okta-preview.yaml +26 -0
- connectkit/connectors/okta.yaml +28 -0
- connectkit/connectors/one-drive-personal.yaml +22 -0
- connectkit/connectors/onlogist.yaml +22 -0
- connectkit/connectors/oomnitza.yaml +28 -0
- connectkit/connectors/open-hands.yaml +22 -0
- connectkit/connectors/openai.yaml +25 -0
- connectkit/connectors/oracle-hcm.yaml +34 -0
- connectkit/connectors/ordinal.yaml +22 -0
- connectkit/connectors/osu.yaml +20 -0
- connectkit/connectors/oura.yaml +20 -0
- connectkit/connectors/outreach.yaml +23 -0
- connectkit/connectors/pagerduty.yaml +41 -0
- connectkit/connectors/paligo.yaml +34 -0
- connectkit/connectors/pandadoc-api-key.yaml +22 -0
- connectkit/connectors/pandadoc.yaml +20 -0
- connectkit/connectors/paycom.yaml +28 -0
- connectkit/connectors/paycor.yaml +34 -0
- connectkit/connectors/payfit.yaml +20 -0
- connectkit/connectors/paypal.yaml +20 -0
- connectkit/connectors/pendo.yaml +22 -0
- connectkit/connectors/pennylane-company-api.yaml +22 -0
- connectkit/connectors/pennylane.yaml +20 -0
- connectkit/connectors/peopledatalabs.yaml +22 -0
- connectkit/connectors/perdoo.yaml +22 -0
- connectkit/connectors/perk.yaml +20 -0
- connectkit/connectors/perplexity.yaml +22 -0
- connectkit/connectors/personio-recruiting.yaml +46 -0
- connectkit/connectors/pingone.yaml +32 -0
- connectkit/connectors/pinterest.yaml +20 -0
- connectkit/connectors/pipedream.yaml +22 -0
- connectkit/connectors/pipedrive.yaml +29 -0
- connectkit/connectors/pivotaltracker.yaml +22 -0
- connectkit/connectors/plain.yaml +22 -0
- connectkit/connectors/pleo.yaml +32 -0
- connectkit/connectors/podium.yaml +26 -0
- connectkit/connectors/postgres.yaml +48 -0
- connectkit/connectors/posthog.yaml +31 -0
- connectkit/connectors/postman.yaml +41 -0
- connectkit/connectors/practicefusion.yaml +35 -0
- connectkit/connectors/precisefp.yaml +20 -0
- connectkit/connectors/printful.yaml +20 -0
- connectkit/connectors/private-api-bearer.yaml +22 -0
- connectkit/connectors/prive.yaml +22 -0
- connectkit/connectors/procore.yaml +26 -0
- connectkit/connectors/productboard.yaml +23 -0
- connectkit/connectors/prospeo.yaml +22 -0
- connectkit/connectors/provenexpert.yaml +28 -0
- connectkit/connectors/prtg-classic.yaml +28 -0
- connectkit/connectors/pylon.yaml +22 -0
- connectkit/connectors/qualia.yaml +34 -0
- connectkit/connectors/qualtrics.yaml +26 -0
- connectkit/connectors/quentn.yaml +28 -0
- connectkit/connectors/quickbase.yaml +34 -0
- connectkit/connectors/quickbooks.yaml +26 -0
- connectkit/connectors/quipteams.yaml +22 -0
- connectkit/connectors/rabbitmq.yaml +72 -0
- connectkit/connectors/ragieai.yaml +22 -0
- connectkit/connectors/ramp.yaml +23 -0
- connectkit/connectors/rapidapi.yaml +28 -0
- connectkit/connectors/razorpay.yaml +28 -0
- connectkit/connectors/readwise-reader.yaml +22 -0
- connectkit/connectors/readwise.yaml +22 -0
- connectkit/connectors/reapit.yaml +26 -0
- connectkit/connectors/recall-ai.yaml +28 -0
- connectkit/connectors/recharge.yaml +22 -0
- connectkit/connectors/recruitcrm.yaml +22 -0
- connectkit/connectors/recruitee.yaml +34 -0
- connectkit/connectors/recruiterflow.yaml +22 -0
- connectkit/connectors/reddit.yaml +22 -0
- connectkit/connectors/redis.yaml +57 -0
- connectkit/connectors/refiner.yaml +22 -0
- connectkit/connectors/replicate.yaml +22 -0
- connectkit/connectors/reply-io.yaml +22 -0
- connectkit/connectors/resend.yaml +25 -0
- connectkit/connectors/retell-ai.yaml +22 -0
- connectkit/connectors/ring-central.yaml +20 -0
- connectkit/connectors/ringover.yaml +22 -0
- connectkit/connectors/rippling-shop-app.yaml +26 -0
- connectkit/connectors/rippling.yaml +22 -0
- connectkit/connectors/rock-gym-pro.yaml +28 -0
- connectkit/connectors/rocketlane.yaml +22 -0
- connectkit/connectors/rocketreach.yaml +22 -0
- connectkit/connectors/rootly.yaml +25 -0
- connectkit/connectors/sage-hr.yaml +28 -0
- connectkit/connectors/sage-people.yaml +29 -0
- connectkit/connectors/sage.yaml +22 -0
- connectkit/connectors/salesforce-experience-cloud.yaml +32 -0
- connectkit/connectors/salesforce.yaml +63 -0
- connectkit/connectors/salesloft.yaml +23 -0
- connectkit/connectors/schwab.yaml +20 -0
- connectkit/connectors/scrapedo.yaml +22 -0
- connectkit/connectors/segment.yaml +20 -0
- connectkit/connectors/sellsy.yaml +20 -0
- connectkit/connectors/semrush.yaml +22 -0
- connectkit/connectors/sendgrid.yaml +22 -0
- connectkit/connectors/sentinelone.yaml +28 -0
- connectkit/connectors/sentry.yaml +51 -0
- connectkit/connectors/servicem8.yaml +20 -0
- connectkit/connectors/servicenow.yaml +26 -0
- connectkit/connectors/shipstation-v2.yaml +22 -0
- connectkit/connectors/shipstation.yaml +28 -0
- connectkit/connectors/shopify-api-key.yaml +28 -0
- connectkit/connectors/shopify-partner.yaml +28 -0
- connectkit/connectors/shopify.yaml +29 -0
- connectkit/connectors/shortcut.yaml +25 -0
- connectkit/connectors/signnow.yaml +20 -0
- connectkit/connectors/simpro.yaml +26 -0
- connectkit/connectors/skio.yaml +22 -0
- connectkit/connectors/slab.yaml +22 -0
- connectkit/connectors/slack.yaml +66 -0
- connectkit/connectors/smartlead-ai.yaml +22 -0
- connectkit/connectors/smartrecruiters-api-key.yaml +22 -0
- connectkit/connectors/smartsheet.yaml +26 -0
- connectkit/connectors/smugmug.yaml +20 -0
- connectkit/connectors/snapchat.yaml +20 -0
- connectkit/connectors/snipe-it.yaml +28 -0
- connectkit/connectors/snowflake-jwt.yaml +44 -0
- connectkit/connectors/snowflake.yaml +29 -0
- connectkit/connectors/splitwise.yaml +20 -0
- connectkit/connectors/spotify.yaml +23 -0
- connectkit/connectors/squarespace.yaml +26 -0
- connectkit/connectors/squareup.yaml +22 -0
- connectkit/connectors/stackexchange.yaml +20 -0
- connectkit/connectors/statista.yaml +22 -0
- connectkit/connectors/stay-ai.yaml +22 -0
- connectkit/connectors/store-leads.yaml +22 -0
- connectkit/connectors/strava-web.yaml +22 -0
- connectkit/connectors/strava.yaml +22 -0
- connectkit/connectors/streak.yaml +22 -0
- connectkit/connectors/stripe-api-key.yaml +28 -0
- connectkit/connectors/stripe-app.yaml +20 -0
- connectkit/connectors/stripe-express.yaml +20 -0
- connectkit/connectors/stripe.yaml +52 -0
- connectkit/connectors/supabase.yaml +28 -0
- connectkit/connectors/survey-monkey.yaml +20 -0
- connectkit/connectors/tailscale-api-key.yaml +28 -0
- connectkit/connectors/tally.yaml +22 -0
- connectkit/connectors/teamleader.yaml +20 -0
- connectkit/connectors/teamtailor.yaml +28 -0
- connectkit/connectors/teamwork.yaml +20 -0
- connectkit/connectors/telegram.yaml +22 -0
- connectkit/connectors/terraform.yaml +22 -0
- connectkit/connectors/thrivecart-api-key.yaml +22 -0
- connectkit/connectors/ticktick.yaml +20 -0
- connectkit/connectors/tiktok-accounts.yaml +20 -0
- connectkit/connectors/tiktok-ads.yaml +20 -0
- connectkit/connectors/tiktok-personal.yaml +20 -0
- connectkit/connectors/timely.yaml +20 -0
- connectkit/connectors/tldv.yaml +22 -0
- connectkit/connectors/todoist.yaml +23 -0
- connectkit/connectors/toggl.yaml +31 -0
- connectkit/connectors/torii.yaml +22 -0
- connectkit/connectors/trakstar-hire.yaml +22 -0
- connectkit/connectors/trello.yaml +56 -0
- connectkit/connectors/tremendous.yaml +20 -0
- connectkit/connectors/triple-whale.yaml +22 -0
- connectkit/connectors/tsheetsteam.yaml +20 -0
- connectkit/connectors/tumblr.yaml +20 -0
- connectkit/connectors/twenty-crm-self-hosted.yaml +28 -0
- connectkit/connectors/twenty-crm.yaml +22 -0
- connectkit/connectors/twilio.yaml +55 -0
- connectkit/connectors/twinfield.yaml +32 -0
- connectkit/connectors/twitch.yaml +22 -0
- connectkit/connectors/twitter-v2.yaml +22 -0
- connectkit/connectors/twitter.yaml +20 -0
- connectkit/connectors/typeform.yaml +23 -0
- connectkit/connectors/typefully-v2.yaml +22 -0
- connectkit/connectors/typefully.yaml +22 -0
- connectkit/connectors/uber.yaml +20 -0
- connectkit/connectors/ukg-pro-wfm.yaml +35 -0
- connectkit/connectors/ukg-pro.yaml +40 -0
- connectkit/connectors/unanet.yaml +40 -0
- connectkit/connectors/unauthenticated.yaml +20 -0
- connectkit/connectors/unipile.yaml +34 -0
- connectkit/connectors/upsales.yaml +22 -0
- connectkit/connectors/valley-api-key.yaml +22 -0
- connectkit/connectors/vercel.yaml +43 -0
- connectkit/connectors/vimeo.yaml +20 -0
- connectkit/connectors/vtex.yaml +34 -0
- connectkit/connectors/wakatime.yaml +20 -0
- connectkit/connectors/wave-accounting.yaml +20 -0
- connectkit/connectors/wealthbox.yaml +20 -0
- connectkit/connectors/webex.yaml +20 -0
- connectkit/connectors/webflow.yaml +23 -0
- connectkit/connectors/webinarjam.yaml +22 -0
- connectkit/connectors/wejam.yaml +22 -0
- connectkit/connectors/whatsapp-business.yaml +22 -0
- connectkit/connectors/whoop.yaml +20 -0
- connectkit/connectors/wildix-pbx.yaml +26 -0
- connectkit/connectors/wise-api-key.yaml +22 -0
- connectkit/connectors/wiseagent.yaml +20 -0
- connectkit/connectors/wiza.yaml +22 -0
- connectkit/connectors/woocommerce.yaml +34 -0
- connectkit/connectors/wordpress.yaml +20 -0
- connectkit/connectors/workable.yaml +31 -0
- connectkit/connectors/workday.yaml +40 -0
- connectkit/connectors/workos.yaml +22 -0
- connectkit/connectors/workpath.yaml +22 -0
- connectkit/connectors/wrike.yaml +26 -0
- connectkit/connectors/xai.yaml +22 -0
- connectkit/connectors/xero.yaml +21 -0
- connectkit/connectors/yahoo.yaml +26 -0
- connectkit/connectors/yandex.yaml +20 -0
- connectkit/connectors/youtube.yaml +67 -0
- connectkit/connectors/zapier-nla.yaml +20 -0
- connectkit/connectors/zapier.yaml +25 -0
- connectkit/connectors/zendesk-sell.yaml +20 -0
- connectkit/connectors/zendesk.yaml +62 -0
- connectkit/connectors/zenefits.yaml +20 -0
- connectkit/connectors/zoho.yaml +35 -0
- connectkit/connectors/zoom.yaml +59 -0
- connectkit/connectors/zorus.yaml +22 -0
- connectkit/meta_tools.py +290 -0
- connectkit/oauth.py +168 -0
- connectkit/runtime.py +189 -0
- connectkit/sdk_adapter.py +42 -0
- connectkit/spec.py +161 -0
- connectkit/utils.py +52 -0
- connectkit/vault.py +202 -0
- connectkit-0.1.0.dist-info/METADATA +197 -0
- connectkit-0.1.0.dist-info/RECORD +560 -0
- connectkit-0.1.0.dist-info/WHEEL +4 -0
- connectkit-0.1.0.dist-info/licenses/LICENSE +21 -0
connectkit/__init__.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""ConnectKit — connect AI agents to SaaS accounts.
|
|
2
|
+
|
|
3
|
+
One YAML file per service. OAuth, token vault, and tool discovery handled automatically.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
__version__ = "0.1.0"
|
|
7
|
+
|
|
8
|
+
from connectkit.bridge import ConnectKitBridge
|
|
9
|
+
from connectkit.meta_tools import TOOL_SPECS
|
|
10
|
+
from connectkit.sdk_adapter import ToolSpec
|
|
11
|
+
from connectkit.spec import AuthType, ConnectorSpec, RequiredField, ToolSourceType, CLIToolSource
|
|
12
|
+
from connectkit.utils import ensure_cli_installed
|
|
13
|
+
from connectkit.vault import CredentialVault
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"ConnectorSpec",
|
|
17
|
+
"AuthType",
|
|
18
|
+
"ToolSourceType",
|
|
19
|
+
"RequiredField",
|
|
20
|
+
"CredentialVault",
|
|
21
|
+
"ConnectKitBridge",
|
|
22
|
+
"ToolSpec",
|
|
23
|
+
"TOOL_SPECS",
|
|
24
|
+
"CLIToolSource",
|
|
25
|
+
"ensure_cli_installed",
|
|
26
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"""CLIAdapter — user-aware subprocess wrapper for CLI-based connectors.
|
|
2
|
+
|
|
3
|
+
Unlike the old CLIToolAdapter singleton in EA's SDK, this:
|
|
4
|
+
1. Reads per-user tokens from CredentialVault
|
|
5
|
+
2. Sets env vars per invocation (no global state)
|
|
6
|
+
3. Discovers tools by parsing CLI --help or a known tool list
|
|
7
|
+
4. Returns namespaced ToolDefinition objects
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
adapter = CLIAdapter(spec, vault, user_id="alice")
|
|
11
|
+
if not adapter.is_available():
|
|
12
|
+
print(f"CLI not installed: {adapter._source.install}")
|
|
13
|
+
|
|
14
|
+
tools = adapter.discover_tools(namespace="google-workspace")
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
import logging
|
|
19
|
+
import os
|
|
20
|
+
import re
|
|
21
|
+
import shutil
|
|
22
|
+
import subprocess
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
from connectkit.spec import CLIToolSource, ConnectorSpec, ToolDescription
|
|
26
|
+
from connectkit.vault import CredentialVault
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger("connectkit")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class CLIAdapter:
|
|
32
|
+
"""Wraps a CLI tool with per-user token injection.
|
|
33
|
+
|
|
34
|
+
Each tool is a closure that spans a subprocess with the user's
|
|
35
|
+
OAuth token in the environment.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
spec: ConnectorSpec,
|
|
41
|
+
vault: CredentialVault,
|
|
42
|
+
user_id: str,
|
|
43
|
+
timeout: int = 60,
|
|
44
|
+
):
|
|
45
|
+
self.spec = spec
|
|
46
|
+
self.vault = vault
|
|
47
|
+
self.user_id = user_id
|
|
48
|
+
self.timeout = timeout
|
|
49
|
+
self._source: CLIToolSource = spec.tool_source # type: ignore[assignment]
|
|
50
|
+
self._command = self._source.command
|
|
51
|
+
|
|
52
|
+
def is_available(self) -> bool:
|
|
53
|
+
return shutil.which(self._command) is not None
|
|
54
|
+
|
|
55
|
+
def _build_env(self) -> dict[str, str]:
|
|
56
|
+
env = os.environ.copy()
|
|
57
|
+
token_data = self.vault.get_token(self.spec.name)
|
|
58
|
+
if not token_data:
|
|
59
|
+
return env
|
|
60
|
+
|
|
61
|
+
for cred_key, env_var in self._source.env_mapping.items():
|
|
62
|
+
if cred_key == "access_token":
|
|
63
|
+
env[env_var] = token_data.get("access_token", "")
|
|
64
|
+
elif cred_key == "api_key":
|
|
65
|
+
env[env_var] = token_data.get("api_key", "")
|
|
66
|
+
elif cred_key in token_data:
|
|
67
|
+
env[env_var] = str(token_data[cred_key])
|
|
68
|
+
|
|
69
|
+
return env
|
|
70
|
+
|
|
71
|
+
def run(self, args: list[str]) -> tuple[int, str, str]:
|
|
72
|
+
env = self._build_env()
|
|
73
|
+
cmd = [self._command] + args
|
|
74
|
+
try:
|
|
75
|
+
result = subprocess.run(
|
|
76
|
+
cmd,
|
|
77
|
+
env=env,
|
|
78
|
+
capture_output=True,
|
|
79
|
+
text=True,
|
|
80
|
+
timeout=self.timeout,
|
|
81
|
+
)
|
|
82
|
+
return result.returncode, result.stdout.strip(), result.stderr.strip()
|
|
83
|
+
except subprocess.TimeoutExpired:
|
|
84
|
+
return -2, "", f"Command timed out after {self.timeout}s: {' '.join(cmd)}"
|
|
85
|
+
except FileNotFoundError:
|
|
86
|
+
return -1, "", f"Command not found: {self._command}. Install: {self._source.install}"
|
|
87
|
+
except Exception as e:
|
|
88
|
+
return -3, "", f"Subprocess error: {e}"
|
|
89
|
+
|
|
90
|
+
def list_commands(self) -> list[str]:
|
|
91
|
+
rc, stdout, _ = self.run(["--list-commands"])
|
|
92
|
+
if rc == 0:
|
|
93
|
+
try:
|
|
94
|
+
return json.loads(stdout)
|
|
95
|
+
except json.JSONDecodeError:
|
|
96
|
+
return [line.strip() for line in stdout.split("\n") if line.strip()]
|
|
97
|
+
|
|
98
|
+
rc, stdout, _ = self.run(["--help"])
|
|
99
|
+
if rc == 0:
|
|
100
|
+
return _parse_subcommands_from_help(stdout)
|
|
101
|
+
|
|
102
|
+
return []
|
|
103
|
+
|
|
104
|
+
def discover_tools(self, namespace: str) -> list[Any]:
|
|
105
|
+
commands = self.list_commands()
|
|
106
|
+
descriptions_by_name = {
|
|
107
|
+
td.name: td for td in self.spec.tool_descriptions
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
tools = []
|
|
111
|
+
for cmd in commands:
|
|
112
|
+
safe_name = cmd.replace(" ", "_").replace("-", "_").replace(":", "_")
|
|
113
|
+
tool_name = f"{namespace}__{safe_name}"
|
|
114
|
+
|
|
115
|
+
td = descriptions_by_name.get(tool_name)
|
|
116
|
+
description = (
|
|
117
|
+
td.description if td
|
|
118
|
+
else f"{self.spec.display}: {cmd}"
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
parameter_descriptions = td.parameter_descriptions if td else {}
|
|
122
|
+
|
|
123
|
+
tool_def = _build_connector_tool(
|
|
124
|
+
name=tool_name,
|
|
125
|
+
description=description,
|
|
126
|
+
adapter=self,
|
|
127
|
+
args=args_from_command(cmd),
|
|
128
|
+
parameter_descriptions=parameter_descriptions,
|
|
129
|
+
)
|
|
130
|
+
tools.append(tool_def)
|
|
131
|
+
|
|
132
|
+
return tools
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def args_from_command(cmd: str) -> list[str]:
|
|
136
|
+
"""Convert a command string like 'gmail:messages:list' to CLI args."""
|
|
137
|
+
return cmd.replace(":", " ").split()
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def _parse_subcommands_from_help(help_text: str) -> list[str]:
|
|
141
|
+
commands = []
|
|
142
|
+
for line in help_text.split("\n"):
|
|
143
|
+
if not line.strip():
|
|
144
|
+
continue
|
|
145
|
+
match = re.search(r"\s{2,}([a-z][a-z0-9_:-]+)(?:\s|$)", line)
|
|
146
|
+
if match:
|
|
147
|
+
commands.append(match.group(1))
|
|
148
|
+
return commands
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _build_connector_tool(
|
|
152
|
+
name: str,
|
|
153
|
+
description: str,
|
|
154
|
+
adapter: CLIAdapter,
|
|
155
|
+
args: list[str],
|
|
156
|
+
parameter_descriptions: dict[str, str] | None = None,
|
|
157
|
+
) -> Any:
|
|
158
|
+
"""Build a ToolDefinition-compatible object for a connector tool.
|
|
159
|
+
|
|
160
|
+
Uses a closure that wraps the subprocess call. The closure:
|
|
161
|
+
1. Formats kwargs as --key value pairs
|
|
162
|
+
2. Calls adapter.run(args + extra_args)
|
|
163
|
+
3. Parses stdout as JSON if possible
|
|
164
|
+
4. Returns a dict with content, structured_content, and error flag
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
def _sync_invoke(**kwargs: Any) -> dict:
|
|
168
|
+
extra = []
|
|
169
|
+
for key, val in kwargs.items():
|
|
170
|
+
if val is None:
|
|
171
|
+
continue
|
|
172
|
+
extra.extend([f"--{key.replace('_', '-')}", str(val)])
|
|
173
|
+
|
|
174
|
+
rc, stdout, stderr = adapter.run(args + extra)
|
|
175
|
+
|
|
176
|
+
result: dict[str, Any] = {
|
|
177
|
+
"content": "",
|
|
178
|
+
"structured_content": None,
|
|
179
|
+
"is_error": False,
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if rc != 0:
|
|
183
|
+
result["content"] = f"Error (code {rc}): {stderr or stdout}"
|
|
184
|
+
result["is_error"] = True
|
|
185
|
+
return result
|
|
186
|
+
|
|
187
|
+
try:
|
|
188
|
+
parsed = json.loads(stdout)
|
|
189
|
+
result["content"] = stdout[:4000]
|
|
190
|
+
result["structured_content"] = parsed
|
|
191
|
+
return result
|
|
192
|
+
except (json.JSONDecodeError, ValueError):
|
|
193
|
+
result["content"] = stdout[:4000]
|
|
194
|
+
return result
|
|
195
|
+
|
|
196
|
+
async def _async_invoke(**kwargs: Any) -> dict:
|
|
197
|
+
import asyncio
|
|
198
|
+
return await asyncio.to_thread(_sync_invoke, **kwargs)
|
|
199
|
+
|
|
200
|
+
params: dict[str, Any] = {
|
|
201
|
+
"type": "object",
|
|
202
|
+
"properties": {
|
|
203
|
+
k: {"type": "string", "description": v}
|
|
204
|
+
for k, v in (parameter_descriptions or {}).items()
|
|
205
|
+
},
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return {
|
|
209
|
+
"name": name,
|
|
210
|
+
"description": description,
|
|
211
|
+
"parameters": params,
|
|
212
|
+
"function": _sync_invoke,
|
|
213
|
+
"ainvoke": _async_invoke,
|
|
214
|
+
"annotations": {
|
|
215
|
+
"read_only": False,
|
|
216
|
+
"destructive": True,
|
|
217
|
+
"idempotent": False,
|
|
218
|
+
"title": name,
|
|
219
|
+
},
|
|
220
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""MCPAdapter — vault token injection for MCP tool source connectors.
|
|
2
|
+
|
|
3
|
+
This adapter wraps a ConnectorSpec whose tool_source.type is "mcp".
|
|
4
|
+
It reads the user's OAuth/API token from CredentialVault, injects it
|
|
5
|
+
into the MCP server process environment, then returns tool definitions.
|
|
6
|
+
|
|
7
|
+
For EA integration, the actual MCP server lifecycle is managed by the
|
|
8
|
+
existing MCPToolBridge + MCPManager. This adapter just provides the
|
|
9
|
+
env dict with per-user tokens.
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
adapter = MCPAdapter(spec, vault, user_id="alice")
|
|
13
|
+
server_env = adapter.build_server_env()
|
|
14
|
+
# Pass server_env to MCPToolBridge when registering the server
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import logging
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
from connectkit.spec import ConnectorSpec, MCPToolSource
|
|
21
|
+
from connectkit.vault import CredentialVault
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger("connectkit")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class MCPAdapter:
|
|
27
|
+
"""Wraps an MCP server connector with per-user token injection."""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
spec: ConnectorSpec,
|
|
32
|
+
vault: CredentialVault,
|
|
33
|
+
user_id: str,
|
|
34
|
+
):
|
|
35
|
+
self.spec = spec
|
|
36
|
+
self.vault = vault
|
|
37
|
+
self.user_id = user_id
|
|
38
|
+
self._source: MCPToolSource = spec.tool_source # type: ignore[assignment]
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def server_name(self) -> str:
|
|
42
|
+
return self._source.server_name
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def command(self) -> str:
|
|
46
|
+
return self._source.command
|
|
47
|
+
|
|
48
|
+
def build_server_env(self) -> dict[str, str]:
|
|
49
|
+
import os
|
|
50
|
+
|
|
51
|
+
env = os.environ.copy()
|
|
52
|
+
token_data = self.vault.get_token(self.spec.name)
|
|
53
|
+
if not token_data:
|
|
54
|
+
return env
|
|
55
|
+
|
|
56
|
+
for cred_key, env_var in self._source.env_mapping.items():
|
|
57
|
+
if cred_key == "access_token":
|
|
58
|
+
env[env_var] = token_data.get("access_token", "")
|
|
59
|
+
elif cred_key == "api_key":
|
|
60
|
+
env[env_var] = token_data.get("api_key", "")
|
|
61
|
+
elif cred_key in token_data:
|
|
62
|
+
env[env_var] = str(token_data[cred_key])
|
|
63
|
+
|
|
64
|
+
return env
|
|
65
|
+
|
|
66
|
+
def get_mcp_config(self) -> dict[str, Any]:
|
|
67
|
+
"""Return config dict suitable for registering with MCPManager.
|
|
68
|
+
|
|
69
|
+
The caller can pass this to their existing MCP server registry.
|
|
70
|
+
"""
|
|
71
|
+
return {
|
|
72
|
+
"command": self._source.command,
|
|
73
|
+
"env": self.build_server_env(),
|
|
74
|
+
"transport": "stdio",
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
def health(self) -> dict[str, Any]:
|
|
78
|
+
try:
|
|
79
|
+
token_data = self.vault.get_token(self.spec.name)
|
|
80
|
+
has_token = token_data is not None and "access_token" in token_data
|
|
81
|
+
return {
|
|
82
|
+
"status": "ok" if has_token else "not_connected",
|
|
83
|
+
"service": self.spec.name,
|
|
84
|
+
"server": self._source.server_name,
|
|
85
|
+
}
|
|
86
|
+
except Exception as e:
|
|
87
|
+
return {"status": "error", "service": self.spec.name, "error": str(e)}
|
connectkit/bridge.py
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""ConnectKitBridge — EA integration point.
|
|
2
|
+
|
|
3
|
+
Mirrors the MCPToolBridge pattern:
|
|
4
|
+
bridge = ConnectKitBridge(user_id="alice")
|
|
5
|
+
await bridge.discover()
|
|
6
|
+
tools = bridge.get_tool_definitions()
|
|
7
|
+
|
|
8
|
+
EA's runner.py injects this between native_tools and AgentLoop creation.
|
|
9
|
+
Each tool dict contains: name, description, parameters, function, ainvoke,
|
|
10
|
+
annotations, and optional _is_mcp_placeholder.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from connectkit.runtime import ConnectorRuntime
|
|
18
|
+
from connectkit.spec import ConnectorSpec
|
|
19
|
+
from connectkit.vault import CredentialVault
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger("connectkit")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _default_vault_path(user_id: str) -> str:
|
|
25
|
+
return str(Path("data") / "users" / user_id / "connectkit")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _default_spec_dir() -> str:
|
|
29
|
+
import os
|
|
30
|
+
|
|
31
|
+
env = os.environ.get("CONNECTKIT_SPEC_DIR")
|
|
32
|
+
if env:
|
|
33
|
+
return env
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
import importlib.resources
|
|
37
|
+
|
|
38
|
+
packaged = Path(str(importlib.resources.files("connectkit") / "connectors"))
|
|
39
|
+
if packaged.exists():
|
|
40
|
+
return str(packaged)
|
|
41
|
+
except Exception:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
return str(Path(__file__).parent.parent / "connectors")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_vault(user_id: str, vault_path: str | None = None) -> CredentialVault:
|
|
48
|
+
"""Get or create a CredentialVault for a user."""
|
|
49
|
+
path = vault_path or _default_vault_path(user_id)
|
|
50
|
+
return CredentialVault(path)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class ConnectKitBridge:
|
|
54
|
+
"""Bridge between Agent Connect and an agent loop.
|
|
55
|
+
|
|
56
|
+
Mirrors the MCPToolBridge pattern exactly:
|
|
57
|
+
- discover() → loads connector specs, checks vault, discovers tools
|
|
58
|
+
- get_tool_definitions() → returns list[dict]
|
|
59
|
+
- health() → reports connector health
|
|
60
|
+
- list_available() → catalog of known connectors
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
def __init__(
|
|
64
|
+
self,
|
|
65
|
+
user_id: str,
|
|
66
|
+
spec_dir: str | None = None,
|
|
67
|
+
vault_path: str | None = None,
|
|
68
|
+
):
|
|
69
|
+
self.user_id = user_id
|
|
70
|
+
self._spec_dir = spec_dir or _default_spec_dir()
|
|
71
|
+
self._vault = get_vault(user_id, vault_path)
|
|
72
|
+
self._runtime = ConnectorRuntime(self._spec_dir, self._vault, user_id)
|
|
73
|
+
self._tools: list[dict[str, Any]] = []
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def spec_dir(self) -> str:
|
|
77
|
+
return self._spec_dir
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def runtime(self) -> ConnectorRuntime:
|
|
81
|
+
return self._runtime
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def vault(self) -> CredentialVault:
|
|
85
|
+
return self._vault
|
|
86
|
+
|
|
87
|
+
async def discover(self) -> None:
|
|
88
|
+
self._tools = self._runtime.get_tools()
|
|
89
|
+
logger.info(
|
|
90
|
+
f"connectkit.discover user={self.user_id} tools={len(self._tools)}"
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
def get_tool_definitions(self) -> list[dict[str, Any]]:
|
|
94
|
+
return self._tools
|
|
95
|
+
|
|
96
|
+
def list_available(self) -> list[dict[str, Any]]:
|
|
97
|
+
return self._runtime.list_available()
|
|
98
|
+
|
|
99
|
+
def list_available_specs(self) -> list[ConnectorSpec]:
|
|
100
|
+
"""Return full ConnectorSpec objects for all known connectors."""
|
|
101
|
+
return self._runtime.get_specs()
|
|
102
|
+
|
|
103
|
+
def health(self) -> dict[str, Any]:
|
|
104
|
+
vault_health = self._vault.health()
|
|
105
|
+
connector_health = self._runtime.health()
|
|
106
|
+
return {
|
|
107
|
+
"vault": vault_health,
|
|
108
|
+
"connectors": connector_health,
|
|
109
|
+
"total_tools": len(self._tools),
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
def connected_services(self) -> list[str]:
|
|
113
|
+
return self._vault.list_connected()
|
|
114
|
+
|
|
115
|
+
def reload_specs(self) -> None:
|
|
116
|
+
self._runtime.reload()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: accelo
|
|
2
|
+
display: Accelo
|
|
3
|
+
icon: accelo
|
|
4
|
+
category: invoicing
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: Accelo
|
|
7
|
+
auth:
|
|
8
|
+
type: oauth2
|
|
9
|
+
oauth2:
|
|
10
|
+
authorize_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/authorize
|
|
11
|
+
token_url: https://${connectionConfig.subdomain}.api.accelo.com/oauth2/v0/token
|
|
12
|
+
scopes:
|
|
13
|
+
- read
|
|
14
|
+
token_env_var: ACCELO_ACCESS_TOKEN
|
|
15
|
+
required_fields:
|
|
16
|
+
- name: subdomain
|
|
17
|
+
label: Accelo Domain
|
|
18
|
+
placeholder: domain
|
|
19
|
+
input_type: text
|
|
20
|
+
help_text: The subdomain of your Accelo account
|
|
21
|
+
optional: false
|
|
22
|
+
setup_guide_url: https://nango.dev/docs/api-integrations/accelo/how-to-register-your-own-accelo-api-oauth-app
|
|
23
|
+
tool_source:
|
|
24
|
+
type: mcp
|
|
25
|
+
server_name: accelo
|
|
26
|
+
command: accelo-mcp-server
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: active-campaign
|
|
2
|
+
display: ActiveCampaign
|
|
3
|
+
icon: active
|
|
4
|
+
category: marketing
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: ActiveCampaign
|
|
7
|
+
auth:
|
|
8
|
+
type: api_key
|
|
9
|
+
api_key:
|
|
10
|
+
env_var: ACTIVE-CAMPAIGN_API_KEY
|
|
11
|
+
required_fields:
|
|
12
|
+
- name: apiKey
|
|
13
|
+
label: API Key
|
|
14
|
+
placeholder: b4f1a7c9d8e56320a9db472fe6c8351f2e0a4d98b7f6c3e5d9a2f4701b3e8d6c3455abbe
|
|
15
|
+
input_type: text
|
|
16
|
+
help_text: The API Key for your ActiveCampaign account
|
|
17
|
+
optional: false
|
|
18
|
+
- name: hostname
|
|
19
|
+
label: Hostname
|
|
20
|
+
placeholder: company.activehosted.com
|
|
21
|
+
input_type: url
|
|
22
|
+
help_text: The Hostname for your ActiveCampaign account
|
|
23
|
+
optional: false
|
|
24
|
+
setup_guide_url: https://nango.dev/docs/integrations/all/active-campaign
|
|
25
|
+
tool_source:
|
|
26
|
+
type: mcp
|
|
27
|
+
server_name: active-campaign
|
|
28
|
+
command: active-campaign-mcp-server
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: acuity-scheduling
|
|
2
|
+
display: Acuity Scheduling
|
|
3
|
+
icon: acuity
|
|
4
|
+
category: productivity
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: Acuity Scheduling
|
|
7
|
+
auth:
|
|
8
|
+
type: oauth2
|
|
9
|
+
oauth2:
|
|
10
|
+
authorize_url: https://acuityscheduling.com/oauth2/authorize
|
|
11
|
+
token_url: https://acuityscheduling.com/oauth2/token
|
|
12
|
+
scopes:
|
|
13
|
+
- api-v1
|
|
14
|
+
token_env_var: ACUITY-SCHEDULING_ACCESS_TOKEN
|
|
15
|
+
required_fields: []
|
|
16
|
+
setup_guide_url: https://nango.dev/docs/integrations/all/acuity-scheduling
|
|
17
|
+
tool_source:
|
|
18
|
+
type: mcp
|
|
19
|
+
server_name: acuity-scheduling
|
|
20
|
+
command: acuity-scheduling-mcp-server
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: addepar
|
|
2
|
+
display: Addepar (OAuth)
|
|
3
|
+
icon: addepar
|
|
4
|
+
category: analytics
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: Addepar (OAuth)
|
|
7
|
+
auth:
|
|
8
|
+
type: oauth2
|
|
9
|
+
oauth2:
|
|
10
|
+
authorize_url: https://id.addepar.com/oauth2/authorize
|
|
11
|
+
token_url: https://api.addepar.com/public/oauth2/token
|
|
12
|
+
scopes:
|
|
13
|
+
- read
|
|
14
|
+
token_env_var: ADDEPAR_ACCESS_TOKEN
|
|
15
|
+
required_fields:
|
|
16
|
+
- name: firmid
|
|
17
|
+
label: Firm ID
|
|
18
|
+
placeholder: ''
|
|
19
|
+
input_type: text
|
|
20
|
+
help_text: Your Addepar Firm ID
|
|
21
|
+
optional: false
|
|
22
|
+
setup_guide_url: https://nango.dev/docs/integrations/all/addepar
|
|
23
|
+
tool_source:
|
|
24
|
+
type: mcp
|
|
25
|
+
server_name: addepar
|
|
26
|
+
command: addepar-mcp-server
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: adobe-commerce
|
|
2
|
+
display: Adobe Commerce
|
|
3
|
+
icon: adobe
|
|
4
|
+
category: e-commerce
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: Adobe Commerce
|
|
7
|
+
auth:
|
|
8
|
+
type: api_key
|
|
9
|
+
api_key:
|
|
10
|
+
env_var: ADOBE-COMMERCE_API_KEY
|
|
11
|
+
required_fields:
|
|
12
|
+
- name: apiKey
|
|
13
|
+
label: Access Token
|
|
14
|
+
placeholder: 3pgsytnpxbyz0waujkw9qllcjb79s379
|
|
15
|
+
input_type: text
|
|
16
|
+
help_text: Your Adobe Commerce access token
|
|
17
|
+
optional: false
|
|
18
|
+
- name: storedomain
|
|
19
|
+
label: Store Domain
|
|
20
|
+
placeholder: yourstore.com
|
|
21
|
+
input_type: url
|
|
22
|
+
help_text: The domain of your Adobe Commerce store
|
|
23
|
+
optional: false
|
|
24
|
+
- name: storecode
|
|
25
|
+
label: Store Code
|
|
26
|
+
placeholder: default
|
|
27
|
+
input_type: text
|
|
28
|
+
help_text: The store code for your Adobe Commerce store
|
|
29
|
+
optional: false
|
|
30
|
+
setup_guide_url: https://nango.dev/docs/api-integrations/adobe-commerce
|
|
31
|
+
tool_source:
|
|
32
|
+
type: mcp
|
|
33
|
+
server_name: adobe-commerce
|
|
34
|
+
command: adobe-commerce-mcp-server
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: adobe-workfront
|
|
2
|
+
display: Adobe Workfront
|
|
3
|
+
icon: adobe
|
|
4
|
+
category: productivity
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: Adobe Workfront
|
|
7
|
+
auth:
|
|
8
|
+
type: oauth2
|
|
9
|
+
oauth2:
|
|
10
|
+
authorize_url: https://${connectionConfig.hostname}/integrations/oauth2/authorize
|
|
11
|
+
token_url: https://${connectionConfig.hostname}/integrations/oauth2/api/v1/token
|
|
12
|
+
scopes:
|
|
13
|
+
- read
|
|
14
|
+
token_env_var: ADOBE-WORKFRONT_ACCESS_TOKEN
|
|
15
|
+
required_fields:
|
|
16
|
+
- name: hostname
|
|
17
|
+
label: Hostname
|
|
18
|
+
placeholder: acme.my.workfront.com
|
|
19
|
+
input_type: text
|
|
20
|
+
help_text: The hostname of your Adobe Workfront account
|
|
21
|
+
optional: false
|
|
22
|
+
setup_guide_url: https://nango.dev/docs/integrations/all/adobe-workfront
|
|
23
|
+
tool_source:
|
|
24
|
+
type: mcp
|
|
25
|
+
server_name: adobe-workfront
|
|
26
|
+
command: adobe-workfront-mcp-server
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: adobe
|
|
2
|
+
display: Adobe
|
|
3
|
+
icon: adobe
|
|
4
|
+
category: design
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: Adobe
|
|
7
|
+
auth:
|
|
8
|
+
type: oauth2
|
|
9
|
+
oauth2:
|
|
10
|
+
authorize_url: https://ims-na1.adobelogin.com/ims/authorize/v2
|
|
11
|
+
token_url: https://ims-na1.adobelogin.com/ims/token/v3
|
|
12
|
+
scopes:
|
|
13
|
+
- offline_access
|
|
14
|
+
token_env_var: ADOBE_ACCESS_TOKEN
|
|
15
|
+
required_fields: []
|
|
16
|
+
setup_guide_url: https://nango.dev/docs/integrations/all/adobe
|
|
17
|
+
tool_source:
|
|
18
|
+
type: mcp
|
|
19
|
+
server_name: adobe
|
|
20
|
+
command: adobe-mcp-server
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: adyen
|
|
2
|
+
display: Adyen
|
|
3
|
+
icon: adyen
|
|
4
|
+
category: payment
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: Adyen
|
|
7
|
+
auth:
|
|
8
|
+
type: oauth2
|
|
9
|
+
oauth2:
|
|
10
|
+
authorize_url: https://ca-${connectionConfig.environment}.adyen.com/ca/ca/oauth/connect.shtml
|
|
11
|
+
token_url: https://oauth-${connectionConfig.environment}.adyen.com/v1/token
|
|
12
|
+
scopes:
|
|
13
|
+
- read
|
|
14
|
+
token_env_var: ADYEN_ACCESS_TOKEN
|
|
15
|
+
required_fields:
|
|
16
|
+
- name: environment
|
|
17
|
+
label: Environment
|
|
18
|
+
placeholder: live|test
|
|
19
|
+
input_type: text
|
|
20
|
+
help_text: The environment to use
|
|
21
|
+
optional: false
|
|
22
|
+
- name: resource
|
|
23
|
+
label: Resource
|
|
24
|
+
placeholder: kyc
|
|
25
|
+
input_type: text
|
|
26
|
+
help_text: The resource to use for your various requests
|
|
27
|
+
optional: false
|
|
28
|
+
setup_guide_url: https://nango.dev/docs/integrations/all/adyen
|
|
29
|
+
tool_source:
|
|
30
|
+
type: mcp
|
|
31
|
+
server_name: adyen
|
|
32
|
+
command: adyen-mcp-server
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: affinity-v2
|
|
2
|
+
display: Affinity (v2)
|
|
3
|
+
icon: affinity
|
|
4
|
+
category: crm
|
|
5
|
+
version: '1.0'
|
|
6
|
+
description: Affinity (v2)
|
|
7
|
+
auth:
|
|
8
|
+
type: api_key
|
|
9
|
+
api_key:
|
|
10
|
+
env_var: AFFINITY-V2_API_KEY
|
|
11
|
+
required_fields:
|
|
12
|
+
- name: apiKey
|
|
13
|
+
label: API Key
|
|
14
|
+
placeholder: nrlW2KR5m-qUCA-rTqKb_EUK1swERlenqn70KNMMrTM
|
|
15
|
+
input_type: text
|
|
16
|
+
help_text: The API Key for your Affinity account
|
|
17
|
+
optional: false
|
|
18
|
+
setup_guide_url: https://nango.dev/docs/integrations/all/affinity-v2
|
|
19
|
+
tool_source:
|
|
20
|
+
type: mcp
|
|
21
|
+
server_name: affinity-v2
|
|
22
|
+
command: affinity-v2-mcp-server
|