Skip to main content
Glama

Quickbase MCP Server

MIT License
270
  • Apple
  • Linux
#!/usr/bin/env python3 """ Test script for relationship operations in the Quickbase MCP integration. This script tests get_table_relationships, create_relationship, update_relationship, and delete_relationship operations. """ import asyncio import json import os import sys import uuid from pathlib import Path # Add parent directory to path to import modules properly sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) from dotenv import load_dotenv from src.quickbase.server import handle_call_tool async def test_relationship_operations(): """Test the relationship operations tools.""" # Load environment variables load_dotenv() # Get Quickbase app ID from environment variable app_id = os.getenv("QUICKBASE_APP_ID") if not app_id: print("Error: QUICKBASE_APP_ID environment variable is not set") return False print(f"Testing relationship operations on app: {app_id}\n") # Generate a unique identifier for this test run test_id = str(uuid.uuid4())[:8] # Test 1: Create two tables to use for relationship testing print("Test 1: Creating parent and child tables for relationship testing") parent_table_name = f"Parent Table {test_id}" child_table_name = f"Child Table {test_id}" try: # Create parent table result = await handle_call_tool("create_table", { "app_id": app_id, "name": parent_table_name, "description": "Parent table for relationship testing", "fields": [ { "name": "Name", "type": "text", "description": "Parent name field" }, { "name": "Description", "type": "text", "description": "Parent description field" } ] }) # Print the result for content in result: print(content.text) # Extract the parent table ID parent_table_id = None for content in result: try: if "Table created successfully" in content.text or "Create Table Result" in content.text: # Try to find the table ID in the response lines = content.text.split('\n') for line in lines: if "id" in line.lower(): parts = line.split(":") if len(parts) > 1: potential_id = parts[1].strip().strip('",').strip('"') if potential_id.startswith("b"): parent_table_id = potential_id break except Exception as e: print(f"Error extracting parent table ID: {str(e)}") if not parent_table_id: print("Error: Could not extract parent table ID from response.") return False print(f"Successfully created parent table with ID: {parent_table_id}\n") # Create child table result = await handle_call_tool("create_table", { "app_id": app_id, "name": child_table_name, "description": "Child table for relationship testing", "fields": [ { "name": "Name", "type": "text", "description": "Child name field" }, { "name": "Value", "type": "numeric", "description": "Child value field" } ] }) # Print the result for content in result: print(content.text) # Extract the child table ID child_table_id = None for content in result: try: if "Table created successfully" in content.text or "Create Table Result" in content.text: # Try to find the table ID in the response lines = content.text.split('\n') for line in lines: if "id" in line.lower(): parts = line.split(":") if len(parts) > 1: potential_id = parts[1].strip().strip('",').strip('"') if potential_id.startswith("b"): child_table_id = potential_id break except Exception as e: print(f"Error extracting child table ID: {str(e)}") if not child_table_id: print("Error: Could not extract child table ID from response.") return False print(f"Successfully created child table with ID: {child_table_id}\n") # Test 2: Get table fields for both tables print("Test 2: Getting table fields for both tables") # Get parent table fields result = await handle_call_tool("get_table_fields", { "table_id": parent_table_id }) parent_fields = [] for content in result: print(content.text) # Try to parse fields try: text = content.text if "Table Fields" in text: start_idx = text.find('{') if start_idx >= 0: json_str = text[start_idx:] fields_data = json.loads(json_str) parent_fields = fields_data except Exception as e: print(f"Error parsing parent fields: {str(e)}") # Get child table fields result = await handle_call_tool("get_table_fields", { "table_id": child_table_id }) child_fields = [] for content in result: print(content.text) # Try to parse fields try: text = content.text if "Table Fields" in text: start_idx = text.find('{') if start_idx >= 0: json_str = text[start_idx:] fields_data = json.loads(json_str) child_fields = fields_data except Exception as e: print(f"Error parsing child fields: {str(e)}") print("Field retrieval completed.\n") # Test 3: Get initial relationships (should be empty) print("Test 3: Getting initial relationships (should be empty)") result = await handle_call_tool("get_table_relationships", { "table_id": child_table_id # Child table is where relationship will be created }) for content in result: print(content.text) print("Initial relationships retrieval completed.\n") # Test 4: Create a relationship print("Test 4: Creating a relationship between parent and child tables") # Get key fields from both tables to use in relationship parent_key_field = None for field in parent_fields: if field.get("fieldType") == "recordid" or field.get("label") == "Record ID#": parent_key_field = field break if not parent_key_field: print("Error: Could not find Record ID field in parent table") return False # Create a relationship relationship_data = { "parentTableId": parent_table_id, "foreignKeyField": { "label": f"Parent Reference {test_id}" }, "lookupFieldIds": [ parent_fields[0].get("id", 6) # First custom field (Name) ], "summaryFields": [ { "label": f"Task Count {test_id}", "summaryFid": 0, # 0 for COUNT type "accumulationType": "COUNT" } ] } result = await handle_call_tool("create_relationship", { "table_id": child_table_id, # Child table is where relationship is created "relationship_data": relationship_data }) relationship_id = None for content in result: print(content.text) # Try to parse relationship ID try: text = content.text if "Created Relationship" in text: start_idx = text.find('{') if start_idx >= 0: json_str = text[start_idx:] relationship_data = json.loads(json_str) relationship_id = relationship_data.get("id") except Exception as e: print(f"Error parsing relationship ID: {str(e)}") if not relationship_id: print("Error: Could not extract relationship ID from response.") print("Note: This could be due to API limitations. Some Quickbase instances restrict relationship creation.") # Continue with tests that don't depend on relationship creation return True print(f"Successfully created relationship with ID: {relationship_id}\n") # Test 5: Get relationships (should now include the new one) print("Test 5: Getting updated relationships (should include the new one)") result = await handle_call_tool("get_table_relationships", { "table_id": child_table_id # Get relationships for the child table }) for content in result: print(content.text) print("Updated relationships retrieval completed.\n") # Test 6: Update the relationship print("Test 6: Updating the relationship") update_data = { "foreignKeyField": { "label": f"Updated Parent Reference {test_id}" } } result = await handle_call_tool("update_relationship", { "table_id": child_table_id, "relationship_id": relationship_id, "relationship_data": update_data }) for content in result: print(content.text) print("Relationship update completed.\n") # Test 7: Delete the relationship print("Test 7: Deleting the relationship") result = await handle_call_tool("delete_relationship", { "table_id": child_table_id, "relationship_id": relationship_id }) for content in result: print(content.text) print("Relationship deletion completed.\n") # Test 8: Verify relationship deletion print("Test 8: Verifying relationship deletion") result = await handle_call_tool("get_table_relationships", { "table_id": child_table_id }) for content in result: print(content.text) print("Relationship deletion verification completed.\n") print("All relationship operations tests completed!") return True except Exception as e: print(f"Error testing relationship operations: {str(e)}") return False if __name__ == "__main__": result = asyncio.run(test_relationship_operations()) sys.exit(0 if result else 1)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/danielbushman/MCP-Quickbase'

If you have feedback or need assistance with the MCP directory API, please join our Discord server