Add card table functionality to Basecamp client and MCP server CLI
- Implement methods for managing card tables and columns in BasecampClient. - Add corresponding tools in MCP server CLI for card table operations. - Update README with new card table tools and usage examples. - Create example script demonstrating card table API usage. - Add unit tests for card table functionality.
This commit is contained in:
153
examples/card_table_example.py
Normal file
153
examples/card_table_example.py
Normal file
@@ -0,0 +1,153 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Example of using the Basecamp Card Table API through the MCP integration.
|
||||
|
||||
This example demonstrates how to:
|
||||
1. Get a card table for a project
|
||||
2. List columns
|
||||
3. Create a new column
|
||||
4. Create cards in columns
|
||||
5. Move cards between columns
|
||||
6. Update column properties
|
||||
"""
|
||||
|
||||
import json
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
def send_mcp_request(method, params=None):
|
||||
"""Send a request to the MCP server and return the response."""
|
||||
request = {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"method": method,
|
||||
"params": params or {}
|
||||
}
|
||||
|
||||
# Run the MCP server with the request
|
||||
process = subprocess.Popen(
|
||||
[sys.executable, "mcp_server_cli.py"],
|
||||
stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
text=True
|
||||
)
|
||||
|
||||
stdout, stderr = process.communicate(input=json.dumps(request))
|
||||
|
||||
if process.returncode != 0:
|
||||
print(f"Error: {stderr}")
|
||||
return None
|
||||
|
||||
try:
|
||||
return json.loads(stdout)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Failed to parse response: {e}")
|
||||
print(f"Response: {stdout}")
|
||||
return None
|
||||
|
||||
def main():
|
||||
"""Demonstrate card table functionality."""
|
||||
|
||||
# Example project ID - replace with your actual project ID
|
||||
project_id = "123456"
|
||||
|
||||
print("Basecamp Card Table Example")
|
||||
print("=" * 50)
|
||||
|
||||
# 1. Get the card table for a project
|
||||
print("\n1. Getting card table for project...")
|
||||
response = send_mcp_request("tools/call", {
|
||||
"name": "get_card_table",
|
||||
"arguments": {"project_id": project_id}
|
||||
})
|
||||
|
||||
if response and "result" in response:
|
||||
result = json.loads(response["result"]["content"][0]["text"])
|
||||
if result.get("status") == "success":
|
||||
card_table = result["card_table"]
|
||||
card_table_id = card_table["id"]
|
||||
print(f"Card table found: {card_table['title']} (ID: {card_table_id})")
|
||||
else:
|
||||
print("No card table found. Make sure the Card Table tool is enabled in your project.")
|
||||
return
|
||||
|
||||
# 2. List existing columns
|
||||
print("\n2. Listing columns...")
|
||||
response = send_mcp_request("tools/call", {
|
||||
"name": "get_columns",
|
||||
"arguments": {
|
||||
"project_id": project_id,
|
||||
"card_table_id": card_table_id
|
||||
}
|
||||
})
|
||||
|
||||
if response and "result" in response:
|
||||
result = json.loads(response["result"]["content"][0]["text"])
|
||||
columns = result.get("columns", [])
|
||||
print(f"Found {len(columns)} columns:")
|
||||
for col in columns:
|
||||
print(f" - {col['title']} (ID: {col['id']})")
|
||||
|
||||
# 3. Create a new column
|
||||
print("\n3. Creating a new column...")
|
||||
response = send_mcp_request("tools/call", {
|
||||
"name": "create_column",
|
||||
"arguments": {
|
||||
"project_id": project_id,
|
||||
"card_table_id": card_table_id,
|
||||
"title": "Testing"
|
||||
}
|
||||
})
|
||||
|
||||
if response and "result" in response:
|
||||
result = json.loads(response["result"]["content"][0]["text"])
|
||||
if result.get("status") == "success":
|
||||
new_column = result["column"]
|
||||
print(f"Created column: {new_column['title']} (ID: {new_column['id']})")
|
||||
|
||||
# 4. Create a card in the first column
|
||||
if columns:
|
||||
first_column_id = columns[0]['id']
|
||||
print(f"\n4. Creating a card in column '{columns[0]['title']}'...")
|
||||
|
||||
response = send_mcp_request("tools/call", {
|
||||
"name": "create_card",
|
||||
"arguments": {
|
||||
"project_id": project_id,
|
||||
"column_id": first_column_id,
|
||||
"title": "Test Card",
|
||||
"content": "This is a test card created via the MCP API"
|
||||
}
|
||||
})
|
||||
|
||||
if response and "result" in response:
|
||||
result = json.loads(response["result"]["content"][0]["text"])
|
||||
if result.get("status") == "success":
|
||||
new_card = result["card"]
|
||||
print(f"Created card: {new_card['title']} (ID: {new_card['id']})")
|
||||
|
||||
# 5. Update column color
|
||||
if columns:
|
||||
print(f"\n5. Updating color of column '{columns[0]['title']}'...")
|
||||
|
||||
response = send_mcp_request("tools/call", {
|
||||
"name": "update_column_color",
|
||||
"arguments": {
|
||||
"project_id": project_id,
|
||||
"column_id": columns[0]['id'],
|
||||
"color": "#FF0000" # Red
|
||||
}
|
||||
})
|
||||
|
||||
if response and "result" in response:
|
||||
result = json.loads(response["result"]["content"][0]["text"])
|
||||
if result.get("status") == "success":
|
||||
print(f"Updated column color to red")
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print("Example completed!")
|
||||
print("\nNote: Replace the project_id with your actual Basecamp project ID to run this example.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user