Asi gworkspace-mcp
gworkspace-mcp - Google Workspace MCP Integration with Temporal Consistency
install
source · Clone the upstream repo
git clone https://github.com/plurigrid/asi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/gworkspace-mcp" ~/.claude/skills/plurigrid-asi-gworkspace-mcp-c3af39 && rm -rf "$T"
manifest:
skills/gworkspace-mcp/SKILL.mdsource content
gworkspace-mcp - Google Workspace MCP Integration with Temporal Consistency
Overview
Integrates Google Workspace services (Gmail, Drive, Calendar, Docs, Sheets, Tasks, Meet) through MCP with:
- Causal Poset Interaction Time: First-class temporal structure for replay determinism
- GF(3) Triadic Conservation: Every action classified as PLUS (+1), ERGODIC (0), or MINUS (-1)
- Cross-Service Atomicity: Two-phase commit for multi-service workflows
- ANIMA Condensation: Saturation states (Inbox Zero, Task Zero) as fixed points
- Retry with 1069 Checkpoints: Balanced ternary error recovery
Trit: 0 (ERGODIC) - Coordinates cross-service workflows
Core Formula
InteractionTime ≅ CausalPoset(Events) GlobalSaturation = (∀s. ServiceSaturated s) ∧ CrossServiceConsistent ∧ TemporalClosure ∧ (Σ trits = 0) FreeTrace ⊣ CondensedInteractionTime -- Temporal adjunction
Predicates
| Predicate | Description | GF(3) Role |
|---|---|---|
| e₁ causally before e₂ | Order structure |
| Neither precedes the other | Concurrency |
| No pending operations | Local stability |
| All dependencies resolved | Global consistency |
| All consequences computed | Causal completeness |
| Full condensation achieved | Fixed point |
| All emails processed | Domain saturation |
| All tasks completed | Domain saturation |
Architecture
┌─────────────────────────────────────────────────────────────────────────────────┐ │ Google Workspace MCP Integration │ ├─────────────────────────────────────────────────────────────────────────────────┤ │ │ │ Services Causal Layer Condensation │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌────────┐ ┌───────────────────────────────────┐ ┌──────────────────┐ │ │ │ Gmail │───▶│ CausalEvent { id, service, │───▶│ GlobalSaturation │ │ │ │Calendar│ │ action, trit, seed, timestamp } │ │ CrossConsistent │ │ │ │ Drive │ └───────────────────────────────────┘ │ TemporalClosure │ │ │ │ Docs │ │ └──────────────────┘ │ │ │ Sheets │ ┌───────────────────────────────────┐ │ │ │ │ Tasks │───▶│ InteractionTime (Causal Poset) │ ▼ │ │ │ Meet │ │ reflexive, transitive, │ ┌──────────────────┐ │ │ └────────┘ │ antisymmetric │ │ ANIMA Condensed │ │ │ └───────────────────────────────────┘ │ InboxZero │ │ │ │ TaskZero │ │ │ └──────────────────┘ │ │ │ │ Concurrency Atomicity Error Recovery │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌────────────┐ ┌───────────────────────────────┐ ┌──────────────────┐ │ │ │Concurrent │ │ TwoPhaseCommit │ │ RetryPolicy │ │ │ │ActionSet │ │ phase1_votes → decision │ │ 1069 checkpoints │ │ │ │ gf3 = 0 │ │ Transaction.gf3_conserved │ │ [+1,-1,-1,+1...] │ │ │ └────────────┘ └───────────────────────────────┘ └──────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────┘
GF(3) Trit Assignment for Actions
| Action | Trit | Polarity | Services |
|---|---|---|---|
, , | 0 | ERGODIC | All |
, , | +1 | PLUS | Gmail, Drive, Docs, Sheets, Tasks |
, , | -1 | MINUS | All |
, , | 0 | ERGODIC | All |
, | +1 | PLUS | Calendar, Meet |
, | 0 | ERGODIC | Docs, Sheets |
Triads (GF(3) = 0)
# Core GWorkspace Triads three-match (-1) ⊗ gworkspace-mcp (0) ⊗ gay-mcp (+1) = 0 ✓ [Core Integration] temporal-coalgebra (-1) ⊗ gworkspace-mcp (0) ⊗ koopman-generator (+1) = 0 ✓ [Causal Dynamics] sheaf-cohomology (-1) ⊗ gworkspace-mcp (0) ⊗ oapply-colimit (+1) = 0 ✓ [Cross-Service] keychain-secure (-1) ⊗ gworkspace-mcp (0) ⊗ gay-mcp (+1) = 0 ✓ [OAuth] polyglot-spi (-1) ⊗ gworkspace-mcp (0) ⊗ agent-o-rama (+1) = 0 ✓ [Multi-Agent] shadow-goblin (-1) ⊗ gworkspace-mcp (0) ⊗ pulse-mcp-stream (+1) = 0 ✓ [Event Stream]
MCP Server Configuration
# .ruler/ruler.toml [mcp_servers.gworkspace] command = "uvx" args = ["gworkspace-mcp"] env = { GOOGLE_CLIENT_ID = "${GOOGLE_CLIENT_ID}", GOOGLE_CLIENT_SECRET = "${GOOGLE_CLIENT_SECRET}", GF3_SEED = "1069" } description = "Google Workspace with causal poset interaction time"
MCP Tools Available
| Tool | Service | Trit | Description |
|---|---|---|---|
| Gmail | 0 | List emails with filters |
| Gmail | 0 | Read email content |
| Gmail | +1 | Send new email |
| Gmail | 0 | Apply/remove labels |
| Gmail | -1 | Archive emails |
| Gmail | -1 | Delete emails |
| Calendar | 0 | List events |
| Calendar | +1 | Create event |
| Calendar | 0 | Update event |
| Calendar | -1 | Delete event |
| Calendar | +1 | Send invites |
| Drive | 0 | List files |
| Drive | +1 | Upload file |
| Drive | 0 | Download file |
| Drive | 0 | Share file |
| Drive | -1 | Delete file |
| Docs | +1 | Create document |
| Docs | 0 | Read document |
| Docs | 0 | Update document |
| Docs | 0 | Export to format |
| Sheets | +1 | Create spreadsheet |
| Sheets | 0 | Read cells |
| Sheets | 0 | Update cells |
| Sheets | 0 | Apply formula |
| Tasks | 0 | List tasks |
| Tasks | +1 | Create task |
| Tasks | -1 | Complete task |
| Tasks | -1 | Delete task |
| Meet | +1 | Schedule meeting |
Cross-Service Workflows
Email → Task → Calendar (Balanced Triad)
# Workflow: Process email, create task, schedule calendar async def email_to_task_calendar(email_id: str, due_date: str): # Step 1: Read email (trit = 0) email = await mcp.gmail_read(email_id) # Step 2: Create task from email (trit = +1) task = await mcp.tasks_create( title=email.subject, notes=email.body[:500], due=due_date ) # Step 3: Create calendar event (trit = +1) event = await mcp.calendar_create( summary=f"Work on: {email.subject}", start=due_date, description=f"Task: {task.id}" ) # Step 4: Archive email (trit = -1) await mcp.gmail_archive(email_id) # Step 5: Complete placeholder task (trit = -1) # GF(3) sum: 0 + 1 + 1 + (-1) + (-1) = 0 ✓ return {"task": task, "event": event}
Two-Phase Commit for Atomicity
async def atomic_workflow(operations: List[Operation]): """Execute operations atomically across services.""" transaction = Transaction( id=next_transaction_id(), operations=operations, services_involved=list(set(op.service for op in operations)) ) # Phase 1: Prepare votes = {} for service in transaction.services_involved: votes[service] = await prepare_service(service, transaction) # Phase 2: Commit or Abort if all(votes.values()): for op in operations: await commit_operation(op) return TransactionState.Committed else: for op in operations: await rollback_operation(op) return TransactionState.Aborted
Causal Closure
# When an action triggers dependent actions DEPENDENCY_GRAPH = { ("gmail", "read"): [("tasks", "create")], # Reading email may create task ("tasks", "create"): [("calendar", "create")], # Task may need calendar slot ("calendar", "create"): [("meet", "schedule")],# Event may need meeting } async def causal_closure(trigger: CausalEvent) -> List[CausalEvent]: """Compute all events causally triggered by an action.""" deps = DEPENDENCY_GRAPH.get((trigger.service, trigger.action), []) result = [] for target_service, target_action in deps: new_event = CausalEvent( id=trigger.id + len(result) + 1, service=target_service, action=target_action, trit=action_trit(target_action), seed=trigger.seed, timestamp=trigger.timestamp + 1 ) result.append(new_event) result.extend(await causal_closure(new_event)) return result
Retry with 1069 Checkpoints
# Balanced ternary checkpoint pattern from mathpix-gem CHECKPOINT_1069 = [+1, -1, -1, +1, +1, +1, +1] # Sums to +3 ≡ 0 mod 3 async def retry_with_checkpoints(operation, max_attempts=7): for attempt, trit in enumerate(CHECKPOINT_1069[:max_attempts]): try: result = await operation() if result.confidence >= trit_to_confidence(trit): return result except APIError as e: if attempt == max_attempts - 1: raise # Adjust strategy based on trit if trit == +1: await enhance_request() elif trit == -1: await try_alternative() else: await validate_partial() await asyncio.sleep(2 ** attempt)
Saturation States
Inbox Zero
def check_inbox_zero(gmail_state: ServiceState) -> bool: """Check if Gmail has reached Inbox Zero saturation.""" return ( gmail_state.pending_ops == [] and all(e.action in ["read", "archive"] for e in gmail_state.committed_ops) )
Task Zero
def check_task_zero(tasks_state: ServiceState) -> bool: """Check if Tasks has reached Task Zero saturation.""" return ( tasks_state.pending_ops == [] and all(e.action == "complete" for e in tasks_state.committed_ops) )
Global Saturation
def check_global_saturation(state: GlobalState) -> bool: """Check if entire workspace has reached ANIMA condensation.""" return ( all(s.pending_ops == [] for s in state.services) and cross_service_consistent(state) and temporal_closure(state) and sum(e.trit for s in state.services for e in s.committed_ops) % 3 == 0 )
Formal Specification
See narya_formal_proofs/SkillAdmissibility.nry for:
- PART 14: InteractionTime as causal poset
- PART 15: ConcurrentActionSet with path invariance
- PART 16: GlobalSaturation with temporal closure
- PART 17: FreeTrace ⊣ CondensedInteractionTime adjunction
- PART 18: Causal closure operator
- PART 19: Transaction with two-phase commit
- PART 20: RetryPolicy with 1069 checkpoints
- PART 21: GWorkspaceService enumeration and theorems
BDD Feature Tests
Feature: Google Workspace MCP Integration @causal-poset Scenario: Interaction time maintains causal ordering Given a sequence of Gmail operations When I construct the InteractionTime poset Then CausallyPrecedes should be transitive And concurrent operations should be independent @gf3-conservation Scenario: Workflow maintains GF(3) conservation Given an email-to-task-calendar workflow When I sum all action trits Then the total should be 0 mod 3 @atomicity Scenario: Cross-service operations are atomic Given a transaction across Gmail and Calendar When one service fails in phase 1 Then all operations should rollback And no partial state should persist @saturation Scenario: Inbox Zero triggers global saturation check Given all emails have been processed When I check GlobalSaturation Then InboxZero predicate should hold And TemporalClosure should be satisfied
Neighbor Awareness
| Position | Skill | Role |
|---|---|---|
| Left (-1) | | Validates workflow patterns |
| Right (+1) | | Generates deterministic colors |
Commands
just gworkspace-auth # OAuth authentication flow just gworkspace-inbox-zero # Process inbox to zero just gworkspace-task-zero # Complete all tasks just gworkspace-saturate # Achieve global saturation just gworkspace-workflow # Run cross-service workflow just gworkspace-test # Run BDD feature tests
References
- SkillAdmissibility.nry - Formal specification
- mathpix-ocr skill - 1069 checkpoint pattern
- mcp-builder skill - MCP server patterns
- temporal-coalgebra skill - State observation
Status: ✅ L4 Admissible (Typed, Documented, Compositional, Predicates + Neighbors) Trit: 0 (ERGODIC) Date: 2025-12-25