Documents created via MCP were not visible in Outline interface. Outline requires an entry in the revisions table to display documents. Now uses transaction to insert into both documents and revisions tables. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
23 KiB
Changelog
All notable changes to this project will be documented in this file.
[1.3.9] - 2026-01-31
Fixed
- Document Visibility (Critical):
create_documentnow creates initial revision- Was: Documents created via MCP didn't appear in Outline interface
- Cause: Outline requires entry in
revisionstable to display documents - Now: Uses transaction to insert into both
documentsandrevisionstables - Documents created via MCP now visible immediately in Outline
[1.3.8] - 2026-01-31
Fixed
- Collection Sort Field:
create_collectionnow sets defaultsortvalue- Was:
sortcolumn left NULL, causing frontend error "Cannot read properties of null (reading 'field')" - Now: Sets
{"field": "index", "direction": "asc"}as default - Outline frontend requires this field to render collections
- Was:
[1.3.7] - 2026-01-31
Fixed
- Tool Name Length: Shortened
outline_bulk_remove_users_from_collectiontooutline_bulk_remove_collection_users- MCP tool names with prefix
mcp__outline-postgresql__were exceeding 64 character limit - Claude API returns error 400 for tool names > 64 chars
- MCP tool names with prefix
[1.3.6] - 2026-01-31
Fixed
- Schema Compatibility: Fixed 3 additional bugs in write operations found during Round 3 testing
create_document- Added missing required columns:id,urlId,teamId,isWelcome,fullWidth,insightsEnabledcreate_collection- Added missing required columns:id,maintainerApprovalRequiredshares_create- Added missing required columns:id,allowIndexing,showLastUpdated
Validated
-
Production Testing (2026-01-31): Full CRUD cycle validated via MCP
list_collections- 2 collections listed ✅create_document- Document created and published ✅update_document- Text updated, version incremented ✅delete_document- Permanently deleted ✅- SSH tunnel active on port 5433
- 164 tools available and functional
-
Code Review Session: All 6 bug fixes confirmed in source code
- INSERT statements verified with correct columns
- ID generation logic validated (gen_random_uuid, urlId generation)
- Unit tests: 209/209 passing
- HTTP server: 164 tools loading correctly
[1.3.5] - 2026-01-31
Fixed
- Schema Compatibility: Fixed 3 bugs found during comprehensive MCP tool testing (Round 1-2)
outline_auth_config- Removed non-existentap.updatedAtcolumn from authentication_providers queryoutline_get_subscription_settings- Added LIMIT 25 to prevent returning all subscriptions (was causing 136KB+ responses)list_collections- RemoveddocumentStructurefield from list query (useget_collectionfor full details)
Tested
-
MCP Tools Coverage (Round 3 - Write Operations):
- Documents:
create_document,update_document,archive_document,restore_document,delete_document✅ - Collections:
create_collection,delete_collection✅ - Groups:
create_group,delete_group✅ - Comments:
comments_create,comments_delete✅ - Shares:
shares_create,shares_revoke✅ - Stars:
stars_create,stars_delete✅ - Pins:
pins_create,pins_delete✅ - API Keys:
api_keys_create,api_keys_delete✅ - Webhooks:
webhooks_create,webhooks_delete✅
- Documents:
-
MCP Tools Coverage (Round 1 & 2 - Read Operations):
- Documents:
list_documents,search_documents✅ - Collections:
list_collections,get_collection✅ - Users:
list_users,get_user✅ - Groups:
list_groups,get_group✅ - Comments:
comments_list✅ - Shares:
shares_list✅ - Revisions:
revisions_list✅ - Events:
events_list,events_stats✅ - Attachments:
attachments_list,attachments_stats✅ - File Operations:
file_operations_list✅ - OAuth:
oauth_clients_list,oauth_authentications_list✅ - Auth:
auth_info✅,auth_config❌ (fixed) - Stars:
stars_list✅ - Pins:
pins_list✅ - Views:
views_list✅ - Reactions:
reactions_list✅ - API Keys:
api_keys_list✅ - Webhooks:
webhooks_list✅ - Backlinks:
backlinks_list✅ - Search Queries:
search_queries_list,search_queries_stats✅ - Teams:
get_team,get_team_stats,list_team_domains✅ - Integrations:
list_integrations✅ - Notifications:
list_notifications,get_notification_settings✅ - Subscriptions:
list_subscriptions,get_subscription_settings✅ (fixed) - Templates:
list_templates✅ - Imports:
list_imports✅ - Emojis:
list_emojis✅ - User Permissions:
list_user_permissions✅ - Analytics: All 6 tools ✅
- Advanced Search: All 6 tools ✅
- Documents:
[1.3.4] - 2026-01-31
Added
- Test Suite: Comprehensive Jest test infrastructure with 209 tests
jest.config.js: Jest configuration for TypeScriptsrc/utils/__tests__/security.test.ts: Security utilities tests (44 tests)src/utils/__tests__/validation.test.ts: Zod validation tests (34 tests)src/utils/__tests__/pagination.test.ts: Cursor pagination tests (25 tests)src/utils/__tests__/query-builder.test.ts: Query builder tests (38 tests)src/tools/__tests__/tools-structure.test.ts: Tools structure validation (68 tests)
Tested
-
Utilities Coverage:
- UUID, email, URL validation
- Rate limiting behaviour
- HTML escaping and sanitization
- Pagination defaults and limits
- Cursor encoding/decoding
- SQL query building
-
Tools Structure:
- All 164 tools validated for correct structure
- Input schemas have required properties defined
- Unique tool names across all modules
- Handlers are functions
Dependencies
- Added
ts-jestfor TypeScript test support
[1.3.3] - 2026-01-31
Fixed
- Schema Compatibility: Fixed 8 additional column/table mismatches found during comprehensive testing
outline_list_groups- Removed non-existentg.descriptioncolumnoutline_analytics_collection_stats- Changedcollection_group_membershipstogroup_permissionsoutline_list_notifications- Removed non-existentn.datacolumnoutline_list_imports- Removed non-existenti.type,documentCount,fileCountcolumnsoutline_list_emojis- Added graceful handling whenemojistable doesn't existoutline_get_team- Removed non-existentpasskeysEnabled,description,preferencescolumnslist_collection_documents- ChangedupdatedByIdtolastModifiedByIdoutline_revisions_compare- ChangedupdatedByIdtolastModifiedById
Tested
- Comprehensive Testing: 45+ tools tested against production database
- All read operations verified
- Analytics, search, and advanced features confirmed working
- Edge cases (orphaned docs, duplicates) handled correctly
Statistics
- Production: hub.descomplicar.pt (462 documents, 2 collections)
- Total Tools: 164 (33 modules)
- Bugs Fixed: 8
[1.3.2] - 2026-01-31
Fixed
- Schema Compatibility: Fixed column name mismatch with production Outline database
- Changed
emojitoiconin documents queries (8 files affected) - Changed
emojitoiconin revisions queries - Updated export/import tools to use
iconfield - Updated templates tools to use
iconfield reactions.emojikept unchanged (correct schema)
- Changed
Files Updated
src/tools/documents.ts- SELECT queriessrc/tools/advanced-search.ts- Search queriessrc/tools/analytics.ts- Analytics queries + GROUP BYsrc/tools/export-import.ts- Export/import with metadatasrc/tools/templates.ts- Template queries + INSERTsrc/tools/collections.ts- Collection document listingsrc/tools/revisions.ts- Revision comparison
Verified
- Production connection: hub.descomplicar.pt (448 documents)
- All 164 tools build without errors
[1.3.1] - 2026-01-31
Added
-
Production Deployment: Configured for hub.descomplicar.pt (EasyPanel)
- SSH tunnel script
start-tunnel.shfor secure PostgreSQL access - Tunnel connects via
172.18.0.46:5432(Docker bridge network) - Local port 5433 for production, 5432 reserved for local dev
- SSH tunnel script
-
Credentials Backup:
CREDENTIALS-BACKUP.mdwith all connection details- Production credentials (EasyPanel PostgreSQL)
- Local development credentials
- Old API-based MCP configuration (for rollback if needed)
Changed
- Claude Code Configuration: Updated
~/.claude.json- Removed old
outlineMCP (API-based, 4 tools) - Updated
outline-postgresqlto use production database - Now connects to hub.descomplicar.pt with 164 tools
- Removed old
Deployment
| Environment | Database | Port | Tunnel Required |
|---|---|---|---|
| Production | descomplicar | 5433 | Yes (SSH) |
| Development | outline | 5432 | No (local Docker) |
Usage
# Start tunnel before Claude Code
./start-tunnel.sh start
# Check status
./start-tunnel.sh status
# Stop tunnel
./start-tunnel.sh stop
[1.3.0] - 2026-01-31
Added
-
Multi-Transport Support: Added HTTP transport alongside existing stdio
src/index-http.ts: New entry point for HTTP/StreamableHTTP transportsrc/server/: New module with shared server logiccreate-server.ts: Factory function for MCP server instancesregister-handlers.ts: Shared handler registration
- Endpoints:
/mcp(MCP protocol),/health(status),/stats(tool counts) - Supports both stateful (session-based) and stateless modes
-
New npm Scripts:
start:http: Run HTTP server (node dist/index-http.js)dev:http: Development mode for HTTP server
Changed
- Refactored
src/index.ts: Now uses shared server module for cleaner code - Server Version: Updated to 1.3.0 across all transports
Technical
- Uses
StreamableHTTPServerTransportfrom MCP SDK (recommended over deprecated SSEServerTransport) - HTTP server listens on
127.0.0.1:3200by default (configurable viaMCP_HTTP_PORTandMCP_HTTP_HOST) - CORS enabled for local development
- Graceful shutdown on SIGINT/SIGTERM
[1.2.5] - 2026-01-31
Fixed
- Connection Leak (PgClient): Fixed connection leak in
testConnection()methodpg-client.ts: Client is now always released usingfinallyblock- Previously, if
SELECT 1query failed after connection was acquired, the connection was never released - Prevents connection pool exhaustion during repeated connection test failures
[1.2.4] - 2026-01-31
Security
-
SQL Injection Prevention (Pagination): Fixed critical SQL injection vulnerability in cursor pagination
pagination.ts: AddedvalidateFieldName()function to sanitize field names- Field names (
cursorField,secondaryField) are now validated against alphanumeric + underscore + dot pattern - Rejects dangerous SQL keywords (SELECT, INSERT, UPDATE, DELETE, DROP, UNION, etc.)
- Prevents injection via cursor field names in ORDER BY clauses
-
Cryptographic Random (Transaction Retry): Replaced
Math.random()withcrypto.randomBytes()for jitter calculationtransaction.ts: Retry jitter now uses cryptographically secure random generation- Maintains consistency with project security standards
Fixed
-
Data Integrity (Comments): Fixed critical atomicity bug in comment deletion
comments.ts: DELETE operations now wrapped in transaction- Prevents orphaned replies if parent comment deletion fails
- Uses
withTransactionNoRetry()to ensure all-or-nothing deletion
-
Error Handling (PgClient): Added try-catch to ROLLBACK operation
pg-client.ts: ROLLBACK failures now logged instead of crashing- Prevents unhandled errors during transaction rollback
- Original error is still thrown after logging rollback failure
-
Memory Leak (Pool Monitoring): Added
.unref()tosetIntervalinPoolMonitormonitoring.ts: Pool monitoring interval now allows process to exit gracefully- Prevents memory leak and hanging processes on shutdown
-
Version Mismatch: Updated hardcoded server version to match package.json
index.ts: Server version now correctly reports '1.2.4'- Ensures consistency across all version references
[1.2.3] - 2026-01-31
Security
-
Cryptographic Random Generation: Replaced
Math.random()withcrypto.randomBytes()for secure secret generationoauth.ts: OAuth client secrets now use cryptographically secure random generationapi-keys.ts: API keys now use cryptographically secure random generation- API keys now store only the hash, not the plain text secret (prevents database breach exposure)
-
URL Validation: Added
isValidHttpUrl()to reject dangerous URL protocolsemojis.ts: Emoji URLs must be HTTP(S) - prevents javascript:, data:, file: protocolswebhooks.ts: Webhook URLs must be HTTP(S) - both create and update operationsusers.ts: Avatar URLs must be HTTP(S) or null
-
Integer Validation: Added validation for numeric IDs from external systems
desk-sync.ts:desk_project_idanddesk_task_idvalidated as positive integers- Prevents injection via numeric parameters
-
Memory Leak Fix: Fixed
setIntervalmemory leak in rate limiting- Rate limit cleanup interval now properly managed with start/stop functions
- Uses
unref()to allow process to exit cleanly - Added graceful shutdown handler to clean up intervals
Fixed
-
parseInt Radix: Added explicit radix (10) to all
parseInt()calls across 5 filescollections.ts,groups.ts,revisions.ts,users.ts,security.ts
-
Savepoint SQL Injection: Added
sanitizeSavepointName()to prevent SQL injection in savepoints- Validates savepoint names against PostgreSQL identifier rules
-
Share URL Generation: Replaced
Math.random()withcrypto.randomBytes()for share URL IDs- Also replaced deprecated
.substr()with modern approach
- Also replaced deprecated
[1.2.2] - 2026-01-31
Security
-
SQL Injection Prevention: Fixed 21 SQL injection vulnerabilities across analytics, advanced-search, and search-queries modules
- Replaced string interpolation with parameterized queries for all user inputs
- Added
validateDaysInterval()function for safe interval validation - Added
isValidISODate()function for date format validation - Added
validatePeriod()function for period parameter validation - All UUID validations now occur BEFORE string construction
- Using
make_interval(days => N)for safe interval expressions
-
Transaction Support: Added atomic operations for bulk operations
bulk-operations.ts: All 6 bulk operations now use transactionsdesk-sync.ts: Create project doc and link task use transactionsexport-import.ts: Import markdown folder uses transactions
-
Rate Limiting: Added automatic cleanup of expired entries (every 5 minutes)
Added
-
Transaction Helper (
src/utils/transaction.ts): Centralized transaction management with advanced featureswithTransaction(): Execute operations with automatic retry for deadlocks (exponential backoff + jitter)withTransactionNoRetry(): Execute without retry for operations with side effectswithReadOnlyTransaction(): Read-only transactions with SERIALIZABLE isolationSavepointclass: Support for nested transaction-like behavior- Configurable retry (maxRetries, baseDelayMs, maxDelayMs, timeoutMs)
- Automatic detection of retryable PostgreSQL errors (40001, 40P01, 55P03)
-
SafeQueryBuilder (
src/utils/query-builder.ts): Helper class for building parameterized queries- Automatic parameter index management
- Built-in UUID validation (
buildUUIDEquals,buildUUIDIn) - ILIKE helpers for case-insensitive search (
buildILike,buildILikePrefix) - Comparison operators (
buildEquals,buildBetween,buildGreaterThan, etc.) - Array operators (
buildIn,buildNotIn) - NULL checks (
buildIsNull,buildIsNotNull) - Condition builder with
addCondition()andaddConditionIf()
-
Input Validation (
src/utils/validation.ts): Zod-based validation system- Common schemas: uuid, email, pagination, isoDate, permission, userRole
withValidation()middleware for automatic tool input validation- Helper functions:
validateUUIDs(),validateEnum(),validateStringLength(),validateNumberRange() toolSchemaswith pre-built schemas for common operations
-
Audit Logging (
src/utils/audit.ts): Automatic logging of write operationslogAudit(): Log single audit event to Outline's events tablelogAuditBatch(): Batch logging for bulk operationswithAuditLog()middleware for automatic logging on toolsAuditEventsconstants for all operation typescreateTeamAuditLogger(): Team-scoped audit logger factory
-
Database Indexes (
migrations/001_indexes.sql): Performance optimization indexes- Full-text search GIN index for documents (10-100x faster searches)
- Collection and membership lookup indexes (10x faster permission checks)
- Event/audit log indexes (5-20x faster analytics)
- User interaction indexes (stars, pins, views)
- Composite indexes for common query patterns
- See
migrations/README.mdfor usage instructions
-
Pool Monitoring (
src/utils/monitoring.ts): Connection pool health monitoringPoolMonitorclass: Continuous monitoring with configurable alertsmonitorPool(): Quick setup function to start monitoringcheckPoolHealth(): One-time health check with issues listlogPoolStats(): Debug helper for current pool status- Configurable thresholds (warning at 80%, critical at 95%)
- Automatic alerting for saturation and waiting connections
- Statistics history with averages over time
-
Cursor-Based Pagination (
src/utils/pagination.ts): Efficient pagination for large datasetspaginateWithCursor(): High-level pagination helperbuildCursorQuery(): Build query parts for cursor paginationprocessCursorResults(): Process results with cursor generationencodeCursor()/decodeCursor(): Base64url cursor encoding- Compound cursors with secondary field for stable sorting
- Bidirectional pagination (next/prev cursors)
- Optional total count with extra query
- Configurable limits (default 25, max 100)
Changed
- Refactored security utilities with new validation functions
- Improved error messages for invalid input parameters
- Consolidated transaction helpers from individual tool files to centralized module
- Updated utils/index.ts to export all new modules
[1.2.1] - 2026-01-31
Added
- Export/Import (2 tools): export_collection_to_markdown, import_markdown_folder - Advanced Markdown export/import with hierarchy
- Desk Sync (2 tools): create_desk_project_doc, link_desk_task - Desk CRM integration for project documentation
Changed
- Total tools increased from 160 to 164
[1.2.0] - 2026-01-31
Added
- Teams (5 tools): get, update, stats, domains, settings - Team/workspace management
- Integrations (6 tools): list, get, create, update, delete, sync - External integrations (Slack, embeds)
- Notifications (4 tools): list, mark read, mark all read, settings - User notification management
- Subscriptions (4 tools): list, subscribe, unsubscribe, settings - Document subscription management
- Templates (5 tools): list, get, create from, convert to/from - Document template management
- Imports (4 tools): list, status, create, cancel - Import job management
- Emojis (3 tools): list, create, delete - Custom emoji management
- User Permissions (3 tools): list, grant, revoke - Document/collection permission management
- Bulk Operations (6 tools): archive, delete, move, restore documents; add/remove users from collection
- Advanced Search (6 tools): advanced search, facets, recent, user activity, orphaned, duplicates
- Analytics (6 tools): overview, user activity, content insights, collection stats, growth metrics, search analytics
Changed
- Total tools increased from 108 to 160
- Updated module exports and index files
- Improved database schema compatibility
[1.1.0] - 2026-01-31
Added
- Stars (3 tools): list, create, delete - Bookmark documents/collections for quick access
- Pins (3 tools): list, create, delete - Pin important documents to collection tops
- Views (2 tools): list, create - Track document views and view counts
- Reactions (3 tools): list, create, delete - Emoji reactions on comments
- API Keys (4 tools): list, create, update, delete - Manage programmatic access
- Webhooks (4 tools): list, create, update, delete - Event notification subscriptions
- Backlinks (1 tool): list - View document link references (read-only view)
- Search Queries (2 tools): list, stats - Search analytics and popular queries
Changed
- Total tools increased from 86 to 108
[1.0.1] - 2026-01-31
Fixed
- Users: Adapted to Outline schema - use
roleenum instead ofisAdmin/isViewer/isSuspendedbooleans - Users: Removed non-existent
usernamecolumn - Groups: Fixed
group_userstable queries - nodeletedAtcolumn, composite PK - Groups: Fixed ambiguous column references in subqueries
- Attachments: Removed non-existent
urlanddeletedAtcolumns - Attachments: Changed delete to hard delete (no soft delete support)
- Auth: Use
suspendedAt IS NOT NULLfor suspended count, returnroleinstead ofisAdmin - Comments: Use
role='admin'for admin user queries - Documents: Use
suspendedAt IS NULLfor active user checks - Events: Return
actorRoleinstead ofactorIsAdmin - Shares: Use
role='admin'for admin user queries
Changed
- Users suspend/activate now use
suspendedAtcolumn instead of boolean - Groups member count uses correct join without deletedAt filter
- All modules validated against Outline v0.78 PostgreSQL schema
[1.0.0] - 2026-01-31
Added
- Initial release of MCP Outline PostgreSQL
- 86 tools across 12 modules for direct PostgreSQL access to Outline Wiki
- Documents (19 tools): CRUD, search, archive, move, templates, memberships
- Collections (14 tools): CRUD, user/group memberships, export
- Users (9 tools): CRUD, suspend, activate, promote, demote
- Groups (8 tools): CRUD, memberships management
- Comments (6 tools): CRUD, resolve functionality
- Shares (5 tools): CRUD, revoke public links
- Revisions (3 tools): list, info, compare versions
- Events (3 tools): audit log, statistics
- Attachments (5 tools): CRUD, storage statistics
- File Operations (4 tools): import/export job management
- OAuth (8 tools): OAuth clients and authentications
- Auth (2 tools): authentication info and config
- PostgreSQL client with connection pooling
- Rate limiting and security utilities
- Full TypeScript implementation with type safety
- MCP SDK v1.0.0 compatibility
Technical
- Direct SQL access (not Outline API) for better performance
- Parameterized queries for SQL injection protection
- Soft delete support across all entities
- Full-text search using PostgreSQL tsvector
- Pagination and sorting on all list operations
Developed by Descomplicar® | descomplicar.pt