Tested full CRUD cycle via MCP in production: - list_collections, create_document, update_document, delete_document - All operations successful with SSH tunnel on port 5433 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
22 KiB
Changelog
All notable changes to this project will be documented in this file.
[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