mcp-config-manager 1.0.13 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/public/style.css CHANGED
@@ -204,6 +204,12 @@ header p {
204
204
  border-color: var(--accent);
205
205
  }
206
206
 
207
+ /* Header Actions */
208
+ .header-actions {
209
+ display: flex;
210
+ gap: var(--space-2);
211
+ }
212
+
207
213
  /* Theme Switcher */
208
214
  .theme-switcher-container {
209
215
  display: flex;
@@ -441,6 +447,14 @@ input:checked + .slider:before {
441
447
  accent-color: var(--accent);
442
448
  }
443
449
 
450
+ .server-info {
451
+ display: flex;
452
+ align-items: center;
453
+ gap: var(--space-2);
454
+ flex: 1;
455
+ min-width: 0;
456
+ }
457
+
444
458
  .server-name {
445
459
  font-weight: 600;
446
460
  color: var(--fg-default);
@@ -700,9 +714,12 @@ input:checked + .slider:before {
700
714
  }
701
715
 
702
716
  /* Ensure kanban card text is visible against colored backgrounds in dark mode */
717
+ .dark-theme .kanban-card {
718
+ border-color: rgba(255, 255, 255, 0.15);
719
+ }
720
+
703
721
  .dark-theme .kanban-card-title {
704
722
  color: #f1f5f9;
705
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
706
723
  }
707
724
 
708
725
  .dark-theme .kanban-card-details {
@@ -713,6 +730,7 @@ input:checked + .slider:before {
713
730
  color: #e2e8f0;
714
731
  }
715
732
 
733
+
716
734
  .kanban-card-actions {
717
735
  display: flex;
718
736
  gap: var(--space-1);
@@ -736,6 +754,311 @@ input:checked + .slider:before {
736
754
  margin-top: var(--space-1);
737
755
  }
738
756
 
757
+ /* ==========================================================================
758
+ Kanban View Header
759
+ ========================================================================== */
760
+
761
+ .kanban-header {
762
+ display: flex;
763
+ justify-content: space-between;
764
+ align-items: center;
765
+ margin-bottom: var(--space-3);
766
+ padding: var(--space-3) 0;
767
+ }
768
+
769
+ .kanban-actions {
770
+ display: flex;
771
+ gap: var(--space-2);
772
+ }
773
+
774
+ /* ==========================================================================
775
+ Server View Header
776
+ ========================================================================== */
777
+
778
+ .server-view-header {
779
+ display: flex;
780
+ justify-content: space-between;
781
+ align-items: center;
782
+ margin-bottom: var(--space-4);
783
+ padding-bottom: var(--space-3);
784
+ border-bottom: 1px solid var(--border-default);
785
+ }
786
+
787
+ .server-view-header h2 {
788
+ margin: 0;
789
+ }
790
+
791
+ .server-view-actions {
792
+ display: flex;
793
+ gap: var(--space-2);
794
+ }
795
+
796
+ /* ==========================================================================
797
+ Radio Button Styling (for client selector)
798
+ ========================================================================== */
799
+
800
+ .radio-item {
801
+ display: flex;
802
+ align-items: center;
803
+ margin-bottom: var(--space-2);
804
+ gap: var(--space-2);
805
+ }
806
+
807
+ .radio-item:last-child {
808
+ margin-bottom: 0;
809
+ }
810
+
811
+ .radio-item input[type="radio"] {
812
+ width: 16px;
813
+ height: 16px;
814
+ margin: 0;
815
+ accent-color: var(--accent);
816
+ cursor: pointer;
817
+ }
818
+
819
+ .radio-item label {
820
+ margin: 0;
821
+ font-size: var(--text-sm);
822
+ color: var(--fg-default);
823
+ cursor: pointer;
824
+ }
825
+
826
+ .client-select-list {
827
+ max-height: 300px;
828
+ }
829
+
830
+ /* ==========================================================================
831
+ Icon Editor - Inline Trigger
832
+ ========================================================================== */
833
+
834
+ .server-name-row {
835
+ display: flex;
836
+ gap: var(--space-2);
837
+ align-items: center;
838
+ }
839
+
840
+ .server-name-row input {
841
+ flex: 1;
842
+ }
843
+
844
+ .icon-edit-trigger {
845
+ display: flex;
846
+ align-items: center;
847
+ gap: var(--space-1);
848
+ padding: var(--space-1) var(--space-2);
849
+ background: var(--bg-muted);
850
+ border: 1px solid var(--border-default);
851
+ border-radius: var(--radius-sm);
852
+ cursor: pointer;
853
+ transition: all var(--transition-fast);
854
+ flex-shrink: 0;
855
+ }
856
+
857
+ .icon-edit-trigger:hover {
858
+ background: var(--bg-surface);
859
+ border-color: var(--border-strong);
860
+ }
861
+
862
+ .icon-edit-trigger:hover .pencil-icon {
863
+ opacity: 1;
864
+ }
865
+
866
+ .icon-preview-mini {
867
+ width: 24px;
868
+ height: 24px;
869
+ display: flex;
870
+ align-items: center;
871
+ justify-content: center;
872
+ overflow: hidden;
873
+ }
874
+
875
+ .icon-preview-mini img {
876
+ max-width: 100%;
877
+ max-height: 100%;
878
+ object-fit: contain;
879
+ border-radius: 2px;
880
+ }
881
+
882
+ .icon-preview-mini .server-logo-fallback {
883
+ width: 100%;
884
+ height: 100%;
885
+ font-size: var(--text-xs);
886
+ border-radius: 2px;
887
+ }
888
+
889
+ .pencil-icon {
890
+ color: var(--fg-subtle);
891
+ opacity: 0.6;
892
+ transition: opacity var(--transition-fast);
893
+ }
894
+
895
+ /* ==========================================================================
896
+ Icon Search Modal
897
+ ========================================================================== */
898
+
899
+ .modal-small {
900
+ max-width: 400px;
901
+ }
902
+
903
+ .icon-search-results {
904
+ min-height: 100px;
905
+ max-height: 200px;
906
+ overflow-y: auto;
907
+ padding: var(--space-3);
908
+ background: var(--bg-muted);
909
+ border-radius: var(--radius-md);
910
+ border: 1px solid var(--border-default);
911
+ margin-bottom: var(--space-3);
912
+ }
913
+
914
+ .icon-search-hint {
915
+ color: var(--fg-subtle);
916
+ font-size: var(--text-sm);
917
+ text-align: center;
918
+ padding: var(--space-4);
919
+ }
920
+
921
+ .icon-quick-actions {
922
+ display: flex;
923
+ gap: var(--space-2);
924
+ margin-bottom: var(--space-3);
925
+ }
926
+
927
+ .icon-quick-btn {
928
+ flex: 1;
929
+ display: flex;
930
+ align-items: center;
931
+ justify-content: center;
932
+ gap: var(--space-2);
933
+ padding: var(--space-2) var(--space-3);
934
+ background: var(--bg-surface);
935
+ border: 1px solid var(--border-default);
936
+ border-radius: var(--radius-sm);
937
+ cursor: pointer;
938
+ font-size: var(--text-sm);
939
+ color: var(--fg-muted);
940
+ transition: all var(--transition-fast);
941
+ }
942
+
943
+ .icon-quick-btn:hover {
944
+ background: var(--bg-muted);
945
+ border-color: var(--border-strong);
946
+ color: var(--fg-default);
947
+ }
948
+
949
+ .icon-quick-btn.selected {
950
+ background: var(--accent-muted);
951
+ border-color: var(--accent);
952
+ color: var(--accent);
953
+ }
954
+
955
+ .icon-quick-btn svg {
956
+ flex-shrink: 0;
957
+ }
958
+
959
+ .icon-search-result {
960
+ display: flex;
961
+ align-items: center;
962
+ gap: var(--space-3);
963
+ padding: var(--space-2);
964
+ border-radius: var(--radius-sm);
965
+ cursor: pointer;
966
+ transition: background var(--transition-fast);
967
+ }
968
+
969
+ .icon-search-result:hover {
970
+ background: var(--bg-surface);
971
+ }
972
+
973
+ .icon-search-result.selected {
974
+ background: var(--accent-muted);
975
+ border: 1px solid var(--accent);
976
+ }
977
+
978
+ .icon-search-result img {
979
+ width: 40px;
980
+ height: 40px;
981
+ border-radius: var(--radius-sm);
982
+ object-fit: contain;
983
+ background: var(--bg-surface);
984
+ }
985
+
986
+ .icon-search-result-info {
987
+ flex: 1;
988
+ }
989
+
990
+ .icon-search-result-domain {
991
+ font-weight: 500;
992
+ font-size: var(--text-sm);
993
+ color: var(--fg-default);
994
+ }
995
+
996
+ .icon-search-result-url {
997
+ font-size: var(--text-xs);
998
+ color: var(--fg-subtle);
999
+ font-family: var(--font-mono);
1000
+ }
1001
+
1002
+ .icon-search-suggestions {
1003
+ margin-bottom: var(--space-3);
1004
+ }
1005
+
1006
+ .suggestions-label {
1007
+ font-size: var(--text-xs);
1008
+ color: var(--fg-subtle);
1009
+ margin-bottom: var(--space-2);
1010
+ text-transform: uppercase;
1011
+ letter-spacing: 0.5px;
1012
+ }
1013
+
1014
+ .suggestions-grid {
1015
+ display: flex;
1016
+ flex-wrap: wrap;
1017
+ gap: var(--space-2);
1018
+ }
1019
+
1020
+ .suggestion-chip {
1021
+ display: flex;
1022
+ align-items: center;
1023
+ gap: var(--space-1);
1024
+ padding: var(--space-1) var(--space-2);
1025
+ background: var(--bg-surface);
1026
+ border: 1px solid var(--border-default);
1027
+ border-radius: var(--radius-sm);
1028
+ cursor: pointer;
1029
+ font-size: var(--text-xs);
1030
+ color: var(--fg-muted);
1031
+ transition: all var(--transition-fast);
1032
+ }
1033
+
1034
+ .suggestion-chip:hover {
1035
+ background: var(--bg-muted);
1036
+ border-color: var(--border-strong);
1037
+ color: var(--fg-default);
1038
+ }
1039
+
1040
+ .suggestion-chip img {
1041
+ width: 16px;
1042
+ height: 16px;
1043
+ border-radius: 2px;
1044
+ }
1045
+
1046
+ .icon-search-loading {
1047
+ display: flex;
1048
+ align-items: center;
1049
+ justify-content: center;
1050
+ padding: var(--space-4);
1051
+ color: var(--fg-subtle);
1052
+ font-size: var(--text-sm);
1053
+ }
1054
+
1055
+ .icon-search-error {
1056
+ color: var(--danger);
1057
+ font-size: var(--text-sm);
1058
+ text-align: center;
1059
+ padding: var(--space-3);
1060
+ }
1061
+
739
1062
  /* ==========================================================================
740
1063
  Server View (All Servers)
741
1064
  ========================================================================== */
@@ -1148,6 +1471,12 @@ input:checked + .slider:before {
1148
1471
  border-bottom: 1px solid var(--border-default);
1149
1472
  }
1150
1473
 
1474
+ .modal-description {
1475
+ font-size: var(--text-sm);
1476
+ color: var(--fg-muted);
1477
+ margin-bottom: var(--space-3);
1478
+ }
1479
+
1151
1480
  /* Larger modals */
1152
1481
  #editServerEnvModal .modal-content,
1153
1482
  #addServerToClientsModal .modal-content {
@@ -1487,6 +1816,293 @@ input:checked + .slider:before {
1487
1816
  font-family: var(--font-mono);
1488
1817
  }
1489
1818
 
1819
+ /* ==========================================================================
1820
+ Server Logos (Shared)
1821
+ ========================================================================== */
1822
+
1823
+ .server-logo-container {
1824
+ display: flex;
1825
+ align-items: center;
1826
+ flex-shrink: 0;
1827
+ }
1828
+
1829
+ .server-logo {
1830
+ border-radius: var(--radius-sm);
1831
+ object-fit: contain;
1832
+ background: var(--bg-muted);
1833
+ flex-shrink: 0;
1834
+ }
1835
+
1836
+ .server-logo-fallback {
1837
+ border-radius: var(--radius-sm);
1838
+ background: var(--bg-muted);
1839
+ display: flex;
1840
+ align-items: center;
1841
+ justify-content: center;
1842
+ font-weight: 600;
1843
+ font-size: var(--text-sm);
1844
+ color: var(--fg-muted);
1845
+ flex-shrink: 0;
1846
+ }
1847
+
1848
+ /* ==========================================================================
1849
+ Popular MCPs Modal
1850
+ ========================================================================== */
1851
+
1852
+ .modal-wide {
1853
+ max-width: 720px;
1854
+ }
1855
+
1856
+ .popular-mcps-filters {
1857
+ display: flex;
1858
+ gap: var(--space-3);
1859
+ margin-bottom: var(--space-4);
1860
+ }
1861
+
1862
+ .popular-mcps-filters input,
1863
+ .popular-mcps-filters select {
1864
+ flex: 1;
1865
+ min-width: 0;
1866
+ padding: var(--space-2) var(--space-3);
1867
+ border: 1px solid var(--border-default);
1868
+ border-radius: var(--radius-sm);
1869
+ background: var(--bg-surface);
1870
+ color: var(--fg-default);
1871
+ font-size: var(--text-sm);
1872
+ }
1873
+
1874
+ .popular-mcps-filters input:focus,
1875
+ .popular-mcps-filters select:focus {
1876
+ outline: none;
1877
+ border-color: var(--accent);
1878
+ }
1879
+
1880
+ .popular-mcps-grid {
1881
+ max-height: 400px;
1882
+ overflow-y: auto;
1883
+ display: flex;
1884
+ flex-direction: column;
1885
+ gap: var(--space-3);
1886
+ }
1887
+
1888
+ .popular-mcp-card {
1889
+ display: flex;
1890
+ gap: var(--space-3);
1891
+ padding: var(--space-3);
1892
+ border: 1px solid var(--border-default);
1893
+ border-radius: var(--radius-md);
1894
+ background: var(--bg-surface);
1895
+ transition: border-color var(--transition-fast);
1896
+ }
1897
+
1898
+ .popular-mcp-card:hover {
1899
+ border-color: var(--border-strong);
1900
+ }
1901
+
1902
+ .popular-mcp-logo-container {
1903
+ flex-shrink: 0;
1904
+ }
1905
+
1906
+ .popular-mcp-logo {
1907
+ width: 40px;
1908
+ height: 40px;
1909
+ border-radius: var(--radius-sm);
1910
+ object-fit: contain;
1911
+ background: var(--bg-muted);
1912
+ }
1913
+
1914
+ .popular-mcp-logo-fallback {
1915
+ width: 40px;
1916
+ height: 40px;
1917
+ border-radius: var(--radius-sm);
1918
+ background: var(--bg-muted);
1919
+ display: flex;
1920
+ align-items: center;
1921
+ justify-content: center;
1922
+ font-weight: 600;
1923
+ font-size: var(--text-sm);
1924
+ color: var(--fg-muted);
1925
+ }
1926
+
1927
+ .popular-mcp-info {
1928
+ flex: 1;
1929
+ min-width: 0;
1930
+ }
1931
+
1932
+ .popular-mcp-name {
1933
+ font-weight: 600;
1934
+ font-size: var(--text-md);
1935
+ color: var(--fg-default);
1936
+ }
1937
+
1938
+ .popular-mcp-description {
1939
+ font-size: var(--text-sm);
1940
+ color: var(--fg-muted);
1941
+ margin-top: var(--space-1);
1942
+ display: -webkit-box;
1943
+ -webkit-line-clamp: 2;
1944
+ -webkit-box-orient: vertical;
1945
+ overflow: hidden;
1946
+ }
1947
+
1948
+ .popular-mcp-meta {
1949
+ display: flex;
1950
+ gap: var(--space-2);
1951
+ margin-top: var(--space-2);
1952
+ flex-wrap: wrap;
1953
+ }
1954
+
1955
+ .category-badge {
1956
+ display: inline-flex;
1957
+ padding: 2px var(--space-2);
1958
+ border-radius: var(--radius-sm);
1959
+ font-size: var(--text-xs);
1960
+ font-weight: 500;
1961
+ background: var(--bg-muted);
1962
+ color: var(--fg-muted);
1963
+ }
1964
+
1965
+ .auth-badge {
1966
+ display: inline-flex;
1967
+ padding: 2px var(--space-2);
1968
+ border-radius: var(--radius-sm);
1969
+ font-size: var(--text-xs);
1970
+ font-weight: 500;
1971
+ text-transform: uppercase;
1972
+ letter-spacing: 0.02em;
1973
+ }
1974
+
1975
+ .auth-badge-none {
1976
+ background: var(--success-muted);
1977
+ color: var(--success);
1978
+ }
1979
+
1980
+ .auth-badge-api-key {
1981
+ background: var(--accent-muted);
1982
+ color: var(--accent);
1983
+ }
1984
+
1985
+ .auth-badge-oauth {
1986
+ background: rgba(139, 92, 246, 0.1);
1987
+ color: #8b5cf6;
1988
+ }
1989
+
1990
+ .popular-mcp-actions {
1991
+ display: flex;
1992
+ align-items: center;
1993
+ flex-shrink: 0;
1994
+ }
1995
+
1996
+ .popular-mcps-attribution {
1997
+ margin-top: var(--space-4);
1998
+ padding-top: var(--space-3);
1999
+ border-top: 1px solid var(--border-default);
2000
+ font-size: var(--text-sm);
2001
+ color: var(--fg-subtle);
2002
+ text-align: center;
2003
+ }
2004
+
2005
+ .popular-mcps-attribution a {
2006
+ color: var(--accent);
2007
+ text-decoration: none;
2008
+ }
2009
+
2010
+ .popular-mcps-attribution a:hover {
2011
+ text-decoration: underline;
2012
+ }
2013
+
2014
+ /* Add Clients Dropdown */
2015
+ .add-clients-dropdown {
2016
+ background: var(--bg-surface);
2017
+ border: 1px solid var(--border-default);
2018
+ border-radius: var(--radius-md);
2019
+ padding: var(--space-3);
2020
+ min-width: 200px;
2021
+ box-shadow: var(--shadow-md);
2022
+ z-index: 1100;
2023
+ }
2024
+
2025
+ .add-clients-dropdown-header {
2026
+ display: flex;
2027
+ align-items: center;
2028
+ gap: var(--space-2);
2029
+ margin-bottom: var(--space-2);
2030
+ padding-bottom: var(--space-2);
2031
+ border-bottom: 1px solid var(--border-default);
2032
+ font-size: var(--text-sm);
2033
+ color: var(--fg-muted);
2034
+ }
2035
+
2036
+ .add-clients-dropdown-header button {
2037
+ padding: 2px var(--space-2);
2038
+ font-size: var(--text-xs);
2039
+ background: var(--bg-muted);
2040
+ border: none;
2041
+ border-radius: var(--radius-sm);
2042
+ color: var(--fg-muted);
2043
+ cursor: pointer;
2044
+ }
2045
+
2046
+ .add-clients-dropdown-header button:hover {
2047
+ background: var(--bg-inset);
2048
+ }
2049
+
2050
+ .add-clients-list {
2051
+ display: flex;
2052
+ flex-direction: column;
2053
+ gap: var(--space-1);
2054
+ max-height: 150px;
2055
+ overflow-y: auto;
2056
+ }
2057
+
2058
+ .add-clients-item {
2059
+ display: flex;
2060
+ align-items: center;
2061
+ gap: var(--space-2);
2062
+ padding: var(--space-1) 0;
2063
+ font-size: var(--text-sm);
2064
+ color: var(--fg-default);
2065
+ cursor: pointer;
2066
+ }
2067
+
2068
+ .add-clients-item input {
2069
+ margin: 0;
2070
+ }
2071
+
2072
+ .add-clients-dropdown-actions {
2073
+ display: flex;
2074
+ justify-content: flex-end;
2075
+ gap: var(--space-2);
2076
+ margin-top: var(--space-3);
2077
+ padding-top: var(--space-2);
2078
+ border-top: 1px solid var(--border-default);
2079
+ }
2080
+
2081
+ /* Button state variants */
2082
+ .btn-success {
2083
+ background: var(--success);
2084
+ border-color: var(--success);
2085
+ }
2086
+
2087
+ .btn-success:hover {
2088
+ background: var(--success);
2089
+ border-color: var(--success);
2090
+ }
2091
+
2092
+ /* Loading and empty states */
2093
+ .loading-state,
2094
+ .empty-state,
2095
+ .error-state {
2096
+ text-align: center;
2097
+ padding: var(--space-6);
2098
+ color: var(--fg-muted);
2099
+ font-size: var(--text-sm);
2100
+ }
2101
+
2102
+ .error-state {
2103
+ color: var(--danger);
2104
+ }
2105
+
1490
2106
  /* ==========================================================================
1491
2107
  Responsive
1492
2108
  ========================================================================== */
@@ -316,13 +316,11 @@ export class MCPConfigManager {
316
316
  }
317
317
  };
318
318
  } else if (format === 'codex') {
319
- // Preserve other Codex settings and update only the mcp_servers table
319
+ // Preserve other Codex settings and replace the mcp_servers table entirely
320
+ // (don't merge with original, otherwise deleted servers get reintroduced)
320
321
  return {
321
322
  ...originalConfig,
322
- mcp_servers: {
323
- ...(originalConfig.mcp_servers || {}),
324
- ...normalizedConfig.servers
325
- }
323
+ mcp_servers: normalizedConfig.servers
326
324
  };
327
325
  }
328
326
  return originalConfig;