Cloud Providers
- AWS — S3, Organizations, IAM with role assumption
- Google Cloud — Workspace and GCP APIs
Vendor Connectors (vendor-connectors) provides universal connectors for cloud providers, third-party services, and AI APIs. Each connector offers three interfaces: Direct Python API, LangChain Tools, and MCP Server.
pip install vendor-connectorsCloud Providers
Services
AI / Agents
Three Interfaces
pip install vendor-connectorsIncludes langchain-core for standard tool definitions.
# AWS supportpip install vendor-connectors[aws]
# Meshy AI 3D generationpip install vendor-connectors[meshy]
# MCP server supportpip install vendor-connectors[mcp]
# Webhookspip install vendor-connectors[webhooks]
# Everythingpip install vendor-connectors[all]# Choose your LLM provider separatelypip install langchain-anthropic # Claudepip install langchain-openai # GPTpip install langchain-google-genai # Geminifrom vendor_connectors import VendorConnectors
# Initialize once - reads credentials from environmentvc = VendorConnectors()
# Cloud providerss3 = vc.get_aws_client("s3")google = vc.get_google_client()
# Servicesgithub = vc.get_github_client(github_owner="myorg")slack = vc.get_slack_client()vault = vc.get_vault_client()zoom = vc.get_zoom_client()
# AI/Agent connectorsanthropic = vc.get_anthropic_client()cursor = vc.get_cursor_client()from vendor_connectors import ( AWSConnector, GithubConnector, SlackConnector, AnthropicConnector, CursorConnector,)
# AWS with role assumptionaws = AWSConnector(execution_role_arn="arn:aws:iam::123456789012:role/MyRole")s3 = aws.get_aws_client("s3")
# GitHub operationsgithub = GithubConnector( github_owner="myorg", github_repo="myrepo", # Token loaded from GITHUB_TOKEN if not provided)
# Slack messagingslack = SlackConnector() # Uses SLACK_TOKEN, SLACK_BOT_TOKENslack.send_message("general", "Hello from vendor-connectors!")Every connector provides three interfaces:
# 1. Direct Python APIfrom vendor_connectors.{connector} import {functionality}
# 2. LangChain Tools (works with CrewAI, LangGraph, etc.)from vendor_connectors.{connector}.tools import get_tools
# 3. MCP Serverfrom vendor_connectors.{connector}.mcp import run_server# or command line: {connector}-mcpfrom vendor_connectors import AWSConnector, AWSConnectorFull
# Basic connector - session managementconnector = AWSConnector()print(f"Session: {connector.session}")
# Full connector with all operationsfull = AWSConnectorFull()
# List S3 bucketsbuckets = full.list_buckets()for bucket in buckets[:5]: print(f" - {bucket['Name']}")
# List organization accountsaccounts = full.get_accounts()for account in accounts: print(f" - {account['Name']} ({account['Id']})")Role Assumption:
from vendor_connectors import AWSConnector
# Assume a role for cross-account accessaws = AWSConnector( execution_role_arn="arn:aws:iam::123456789012:role/CrossAccountRole")s3 = aws.get_aws_client("s3")Environment Variables:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_DEFAULT_REGIONEXECUTION_ROLE_ARNfrom vendor_connectors import GithubConnector
github = GithubConnector( github_owner="extended-data-library", github_repo="core", # Uses GITHUB_TOKEN from environment)
# Get repository inforepo = github.get_repository()print(f"Stars: {repo['stargazers_count']}")
# List files in a directoryfiles = github.list_files(path="src")
# Read file contentscontent = github.get_file_contents("README.md")
# GraphQL queriesquery = """query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { issues(first: 5) { nodes { title } } }}"""result = github.graphql(query)Environment Variables:
GITHUB_TOKENGITHUB_OWNERfrom vendor_connectors import AnthropicConnector
claude = AnthropicConnector() # Uses ANTHROPIC_API_KEY
# Create a messageresponse = claude.create_message( model="claude-sonnet-4-5-20250929", max_tokens=1024, messages=[ {"role": "user", "content": "Explain quantum computing in simple terms"} ])print(response.text)
# Count tokens before sendingtokens = claude.count_tokens( model="claude-sonnet-4-5-20250929", messages=[{"role": "user", "content": "Hello!"}])print(f"Input tokens: {tokens}")
# Get recommended model for use casemodel = claude.get_recommended_model("coding")print(f"Recommended: {model}") # claude-sonnet-4-5-20250929Environment Variables:
ANTHROPIC_API_KEYManage Cursor Background Agents programmatically:
from vendor_connectors import CursorConnector
cursor = CursorConnector() # Uses CURSOR_API_KEY
# List all agentsagents = cursor.list_agents()for agent in agents: print(f"{agent.id}: {agent.state}")
# Launch a new agentagent = cursor.launch_agent( prompt_text="Implement user authentication with OAuth2", repository="myorg/myrepo", ref="main", auto_create_pr=True,)print(f"Launched: {agent.id}")
# Check statusstatus = cursor.get_agent_status(agent.id)print(f"State: {status.state}")
# Send follow-upcursor.add_followup(agent.id, "Also add rate limiting")
# List available repositoriesrepos = cursor.list_repositories()Environment Variables:
CURSOR_API_KEYAI-powered 3D asset generation with three interfaces:
from vendor_connectors import meshy
# Generate a 3D model from textmodel = meshy.text3d.generate("a medieval sword with ornate handle")print(model.model_urls.glb)
# Rig for animationrigged = meshy.rigging.rig(model.id)
# Apply animation (678 available)animated = meshy.animate.apply(rigged.id, animation_id=0) # Idle
# Retexturegold_sword = meshy.retexture.apply(model.id, "golden with embedded gems")from vendor_connectors.meshy.tools import get_toolsfrom langchain_anthropic import ChatAnthropicfrom langgraph.prebuilt import create_react_agent
# Get Meshy tools (standard LangChain StructuredTools)tools = get_tools()print(f"Available: {[t.name for t in tools]}")
# Create agentllm = ChatAnthropic(model="claude-sonnet-4-20250514")agent = create_react_agent(llm, tools)
# Use the agentresult = agent.invoke({ "messages": [("user", "Generate a 3D model of a futuristic spaceship")]})# Run programmaticallyfrom vendor_connectors.meshy.mcp import run_serverrun_server()
# Or via command line# $ meshy-mcpClaude Desktop Configuration:
{ "mcpServers": { "meshy": { "command": "meshy-mcp", "env": { "MESHY_API_KEY": "your-api-key-here" } } }}Environment Variables:
MESHY_API_KEYfrom vendor_connectors import SlackConnector
slack = SlackConnector() # Uses SLACK_TOKEN, SLACK_BOT_TOKEN
# Send a messageslack.send_message("general", "Hello from vendor-connectors!")
# Send with blocksblocks = [ { "type": "section", "text": {"type": "mrkdwn", "text": "*Hello!* :wave:"} }]slack.send_message("general", "Formatted message", blocks=blocks)Environment Variables:
SLACK_TOKENSLACK_BOT_TOKENfrom vendor_connectors import VaultConnector
# Token authvault = VaultConnector() # Uses VAULT_ADDR, VAULT_TOKEN
# AppRole authvault = VaultConnector( vault_addr="https://vault.example.com", vault_role_id="role-id", vault_secret_id="secret-id",)
# Read secretssecret = vault.read_secret("secret/data/myapp")print(secret["data"]["password"])
# Write secretsvault.write_secret("secret/data/myapp", {"password": "new-value"})Environment Variables:
VAULT_ADDRVAULT_TOKENVAULT_ROLE_IDVAULT_SECRET_IDfrom vendor_connectors import ZoomConnector
zoom = ZoomConnector() # Uses ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRET, ZOOM_ACCOUNT_ID
# List meetingsmeetings = zoom.list_meetings()
# Create meetingmeeting = zoom.create_meeting( topic="Team Standup", start_time="2024-01-15T10:00:00Z", duration=30,)print(f"Join URL: {meeting['join_url']}")
# List usersusers = zoom.list_users()Environment Variables:
ZOOM_CLIENT_IDZOOM_CLIENT_SECRETZOOM_ACCOUNT_IDAll connectors extend DirectedInputsClass, providing:
Credentials are loaded automatically from multiple sources (priority order):
# All equivalent - credentials loaded transparentlyfrom vendor_connectors import GithubConnector
# Option 1: Environment variable# export GITHUB_TOKEN="your-token"github = GithubConnector(github_owner="myorg")
# Option 2: Direct parametergithub = GithubConnector( github_owner="myorg", github_token="your-token")
# Option 3: Works across all interfacesfrom vendor_connectors.meshy.tools import get_tools# export MESHY_API_KEY="your-key"tools = get_tools() # Automatically uses environmentVendorConnectors caches clients by parameters:
from vendor_connectors import VendorConnectors
vc = VendorConnectors()
# Same parameters = same instance (cached)github1 = vc.get_github_client(github_owner="myorg")github2 = vc.get_github_client(github_owner="myorg")assert github1 is github2
# Different parameters = different instancegithub3 = vc.get_github_client(github_owner="otherorg")assert github1 is not github3| Variable | Connector | Description |
|---|---|---|
ANTHROPIC_API_KEY | Anthropic | Claude API key |
CURSOR_API_KEY | Cursor | Background Agent API key |
AWS_ACCESS_KEY_ID | AWS | AWS credentials |
AWS_SECRET_ACCESS_KEY | AWS | AWS credentials |
AWS_DEFAULT_REGION | AWS | Default region |
EXECUTION_ROLE_ARN | AWS | Role to assume |
GITHUB_TOKEN | GitHub | Personal access token |
GITHUB_OWNER | GitHub | Organization/user |
GOOGLE_SERVICE_ACCOUNT | Service account JSON | |
SLACK_TOKEN | Slack | User token |
SLACK_BOT_TOKEN | Slack | Bot token |
VAULT_ADDR | Vault | Server URL |
VAULT_TOKEN | Vault | Auth token |
VAULT_ROLE_ID | Vault | AppRole role ID |
VAULT_SECRET_ID | Vault | AppRole secret ID |
ZOOM_CLIENT_ID | Zoom | OAuth client ID |
ZOOM_CLIENT_SECRET | Zoom | OAuth client secret |
ZOOM_ACCOUNT_ID | Zoom | Account ID |
MESHY_API_KEY | Meshy | Meshy AI API key |